Find Minimum in Rotated Sorted Array
LeetCode 153. Find Minimum in Rotated Sorted Array
원문
Suppose an array of length n
sorted in ascending order is rotated between 1
and n
times. For example, the array nums = [0,1,2,4,5,6,7]
might become:
[4,5,6,7,0,1,2]
if it was rotated4
times.[0,1,2,4,5,6,7]
if it was rotated7
times.
Notice that rotating an array [a[0], a[1], a[2], ..., a[n-1]]
1 time results in the array [a[n-1], a[0], a[1], a[2], ..., a[n-2]]
.
Given the sorted rotated array nums
of unique elements, return the minimum element of this array.
You must write an algorithm that runs in O(log n)
time.
풀이
Search in Rotated Sorted Array에서 힌트를 얻었다.
- 이분 탐색을 시행한다.
nums[mid]
가nums[lo]
와nums[hi]
보다 크면 오른쪽을 확인해야 한다.nums[mid]
가nums[lo]
와nums[hi]
보다 작으면 왼쪽을 확인해야 한다.nums[mid]
가nums[hi]
보다 크면 오른쪽을 확인해야 한다.nums[mid]
가nums[lo]
보다 크면 왼쪽을 확인해야 한다.- 그 외의 경우
nums[mid]
를 반환한다.
- 반복문 중간에서 값을 반환하지 않은 경우
nums[lo]
를 반환한다.
코드
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def findMin(self, nums: List[int]) -> int:
lo, hi = 0, len(nums) - 1
while lo < hi:
mid = (lo + hi) // 2
if nums[lo] < nums[mid] and nums[hi] < nums[mid]: lo = mid + 1
elif nums[lo] > nums[mid] and nums[hi] > nums[mid]: hi = mid
elif nums[mid] > nums[hi]: lo = mid + 1
elif nums[mid] > nums[lo]: hi = mid
else: return nums[mid]
return nums[lo]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int findMin(int[] nums) {
int lo = 0;
int hi = nums.length - 1;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (nums[mid] > nums[lo] && nums[mid] > nums[hi]) {
lo = mid + 1;
} else if (nums[mid] < nums[lo] && nums[mid] < nums[hi]) {
hi = mid;
} else if (nums[mid] > nums[hi]) {
lo = mid + 1;
} else if (nums[mid] > nums[lo]) {
hi = mid;
} else {
return nums[mid];
}
}
return nums[lo];
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.