알고리즘
[LEETCODE] 34. Find First and Last Position of Element in Sorted Array
JSYOvO
2021. 4. 8. 10:43
728x90
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.size() == 0) return {-1, -1};
int left = 0;
int right = nums.size() - 1;
while(left < right){
int chk = nums[(left + right)/2];
if(chk == target) {
left = (left + right)/2;
right = left;
break;
}
if(chk > target){
right = (left + right)/2 - 1;
} else {
left = (left + right)/2 + 1;
}
}
// cout<<"left : "<<left<<endl;
// cout<<"right : "<<right<<endl;
if(left != right) return {-1, -1};
if(nums[left] != target) return {-1, -1};
int base = left;
while(left > -1 && nums[left] == nums[base]){
left--;
}
while(right < nums.size() && nums[right] == nums[base]){
right++;
}
return {left + 1, right - 1};
}
};
시간복잡도 O(logn)으로 풀어달란 조건이 있어 당연히 바이너리 서치로 구현해보았다.
매번 채점할때마다 속도가 좀 다르긴하지만 100%짜리도 나왔다.
Discuss를 확인해보니 기억에서 사라졌던 lower_bound, upper_bound를 사용하여
바이너리 서치를 좀 더 쉽게 구현해둔 소스가 있던데 아래와 같습니다.
나중에 요 STL 요긴하게 써먹을 일이 있을 것 같습니다 ㅎ
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.size() == 0 || nums[nums.size()-1]<target) return {-1, -1};
auto lower = lower_bound(nums.begin(), nums.end(), target);
auto upper = upper_bound(nums.begin(), nums.end(), target);
if(nums[lower - nums.begin()] != target) return {-1, -1};
// return {lower - nums.begin(), upper - nums.begin()};
vector<int>result;
result.push_back(lower-nums.begin());
result.push_back(upper-nums.begin()-1);
return result;
}
};