Bleeding edge

[leetcode] 34. Find First and Last Position of Element in Sorted Array - 자바스크립트 0607 본문

코딩테스트 공부

[leetcode] 34. Find First and Last Position of Element in Sorted Array - 자바스크립트 0607

codevil 2022. 6. 7. 13:47

https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/

 

Find First and Last Position of Element in Sorted Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제에는 [nums, target] 두가지의 변수가 주어진다.

nums라는 정렬 안에 target이 들어있다고 하면, nums에서의 시작위치와 끝 위치를 return 하는 문제이다.

만일, nums에 target이 없다고 하면 [-1, -1]을 return한다.

1. Boundary Condition을 적는다면, nums가 빈 정렬이면 [-1, -1]을 return 한다.

    if (nums.length === 0) return [-1, -1]

2. nums는 숫자로 정렬되어 있기 때문에, target이 nums[0]보다 작거나, nums[nums.length-1]보다 크면 [-1. -1]을 정렬한다

    if (nums[start] > target || nums[end] < target) return [-1, -1]

 

문제 풀이를 위해 Binary Search를 적용한다

    while (start <= end) {
        let mid = Math.floor((start + end) / 2)
        if (nums[mid] <= target) {
            res = mid
            start = mid + 1
        } else {
            end = mid - 1
        }
    }

이 Binary Search를 적용하여 얻는 값은 res이다.

res는, start와 end가 서로 크기가 같거나 end가 start보다 작아진 경우 target이 없는 것이기 때문에, 이 경우에는 return [-1, -1]을 해야한다

    if (nums[res] !== target) return [-1, -1]

target이 여러개인 경우와 한개인 경우 두가지인 경우가 있다. 이 위치를 표시하기 위해서

    let p1 = res
    let p2 = res

두개의 점을 잡고

    while (nums[p1] === target) {
        p1 -= 1
    }
    while (nums[p2] === target) {
        p2 += 1

    }

target이 아닐 때까지 p1은 -1, p2는 +1을 적용한뒤

    return [p1 + 1, p2 - 1]

값을 리턴해준다. 이때 각각 +1, -1을 해주는 이유는, 값이 달라질때까지 값을 변화시키기 때문에 target과 같은 값을 return 하려고하면 p1+1, p2-1을 해줘야한다.

전체 풀이이다

var searchRange = function (nums, target) {
    let start = 0
    let end = nums.length
    let res = 0
    if (nums.length === 0) return [-1, -1]
    if (nums[start] > target || nums[end] < target) return [-1, -1]
    while (start <= end) {
        let mid = Math.floor((start + end) / 2)
        if (nums[mid] <= target) {
            res = mid
            start = mid + 1
        } else {
            end = mid - 1
        }
    }
    if (nums[res] !== target) return [-1, -1]
    let p1 = res
    let p2 = res
    while (nums[p1] === target) {
        p1 -= 1
    }
    while (nums[p2] === target) {
        p2 += 1
    }
    return [p1 + 1, p2 - 1]
};