[LeetCode] 34. Find First and Last Position of Element in Sorted Array
Updated:
[Medium] 34. Find First and Last Position of Element in Sorted Array
https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
Example 1
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
문제 설명
33번 문제보다 훨씬 쉽다. 완전히 정렬된 배열이 주어지고, 찾는 값의 start index와 end index를 len 2인 배열로 반환한다. 없을 경우 -1을 채워 반환한다.
나의 풀이
O(logN)
- O(logN)의 경우 Binary Search를 이용하면 풀 수 있다.
- 일단 값을 찾은 경우, 좌측, 우측으로 while로 이동하여 start와 end index를 구한다.
- 여러가지 제약조건을 넣어 코드가 지저분하지만 1ms의 속도를 가진다.
- 최악의 상황으로, 만일 모든 값이 동일한 배열이 주어질 경우, O(N)이기 때문에, 각 방향으로 binary search를 수행하는 방법이 더 적합해 보인다. O(2logN)
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] result = {-1, -1};
int low = 0;
int high = nums.length - 1;
if(nums.length == 0){
return result;
}
if(nums.length == 1 && nums[0] == target){
result[0] = 0;
result[1] = 0;
return result;
}
while (low < high) {
int mid = (low + high) / 2;
if (nums[mid] == target) {
int start = mid;
int end = mid;
while(start > 0 && nums[start-1] == target){
start--;
}
while(end < nums.length-1 && nums[end+1] == target){
end++;
}
result[0] = start;
result[1] = end;
}
if (nums[mid] < target) {
low = mid + 1;
} else {
high = mid;
}
}
if (nums[low] == target) {
int start = low;
int end = low;
while(start > 0 && nums[start-1] == target){
start--;
}
while(end < nums.length-1 && nums[end+1] == target){
end++;
}
result[0] = start;
result[1] = end;
}
return result;
}
}
Leave a comment