Find First and Last Position of Element in Sorted Array
Find First and Last Position of Element in Sorted Array
ソート整数配列numsのtargetと同じ値の開始インデックスと終了インデックスの戻り
ない場合は[1,1]を返します.
O(logn)を時間的に複雑にする.
せいげんじょうけん
[2020.11.22]
問題の説明
ソート整数配列numsのtargetと同じ値の開始インデックスと終了インデックスの戻り
ない場合は[1,1]を返します.
O(logn)を時間的に複雑にする.
せいげんじょうけん
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums is a non-decreasing array.
-109 <= target <= 109
トラブルシューティングプロセス
Input : vector<int> nums, int target
Output : vector<int>
二重引用符ナビゲーションを使用してtargetを検索し、targetとは異なる数になるまでインデックス値を前後に切り替え、「開始」および「終了」インデックスを検索して返します.コード#コード#
[2020.11.22]
class Solution {
public:
// target을 발견했을 때 시작인덱스와 끝인덱스를 찾는 함수
vector<int> find(vector<int>& nums, int mid, int target) {
int start = mid, end = mid;
while(nums[start] == target) {
if(start - 1 >= 0) start--;
else {
start--;
break;
}
}
while(nums[end] == target) {
if(end + 1 < nums.size()) end++;
else {
end++;
break;
}
}
return {start+1, end-1};
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> answer = {-1, -1};
if(nums.size() == 0) return answer;
int first = 0, last = nums.size() -1, mid = (first+last)/2;
while(1) {
if(nums[mid] < target) {
first = mid;
mid = (first+last)/2;
}
else if(nums[mid] > target) {
last = mid;
mid = (first+last)/2;
}
else {
return find(nums, mid, target);
break;
}
if(first == last || first + 1 == last) {
if(nums[first] == target) return find(nums, first, target);
else if(nums[last] == target) return find(nums, last, target);
break;
}
}
return answer;
}
};
# 예외케이스
first와 last의 값이 같을 때와 나란히 존재할때에 끝내주지 않으면 런타임에러(무한루프)가 나오기에 break문을 설정해줘야한다.
이때 두 값 중에 답이 존재할 수 있기에 확인한다.
# 주의
find함수에서 존재하지않는 값에 접근하는 오버플로우의 발생에 조심해야한다.
Reference
この問題について(Find First and Last Position of Element in Sorted Array), 我々は、より多くの情報をここで見つけました https://velog.io/@yerin6860/Find-First-and-Last-Position-of-Element-in-Sorted-Arrayテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol