관리 메뉴

有希

LeetCode/Find First and Last Position of Element in Sorted Array 본문

프로그래밍/알고리즘+코딩테스트

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

有希. 2022. 4. 12. 23:45

문제에서 O(log n) 이라고 했으니 이진탐색으로 풀어야 한다.

가장 작은 idx와 가장 큰 idx 를 골라내어야 한다.

가장 작은 경우: mid값이 target보다 크거나 같다면 right를 mid-1로 지정하고, 아니라면 left를 mid+1로 지정한다. 이 이유는 같은 경우에도 왼쪽에 더 작은 값이 있는지 봐야하기 때문이다.

가장 큰 경우: mid값이 target보다 크다면 right를 mid-1로 지정하고, 아니라면 left를 mid+1로 지정한다. 이유는 left right가 겹칠때까지 전부 찾은다음 target의 가장 큰 idx를 찾아야 하기 때문이다.

if문에서 같으면 무조건 갱신하는 것 또한 중요하다.

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> result(2, -1);
        
        int size = nums.size(), left = 0, right = size-1, ans = -1;
        //get min
        while(left <= right)
        {
            int mid = (right+left)/2;
            if(nums[mid] == target)
                ans = mid;
            nums[mid] >= target? right = mid - 1 : left = mid + 1;
        }
        result[0] = ans;
        
        //resetting
        left = 0, right = size-1, ans = -1;

        //get max
        //가운데값이 크면은 오른쪽을 줄인다. 같다면 왼쪽을 줄여서 더 오른쪽에도 같은 값이 있는지 확인한다.
        while(left<= right)
        {
            int mid = (left+right)/2;
            
            if(nums[mid] == target)
                ans = mid;
            nums[mid] > target ? right = mid -1 : left = mid + 1;
        }

        result[1] = ans;
        return result;
    }
};

 

'프로그래밍 > 알고리즘+코딩테스트' 카테고리의 다른 글

LeetCode/Rotate Image  (0) 2022.04.20
LeetCode/Permutations  (0) 2022.04.20
HackerRank/Merge two sorted linked lists  (0) 2022.04.05
HackerRank/Recursive Digit Sum  (0) 2022.04.04
HackerRank/Grid Challenge  (0) 2022.04.04