[LeetCode] 153. Find Minimum in Rotated Sorted Array
1에서 n번만큼 회전된 길이가 n인 정렬된 리스트가 주어졌을 때 가장 작은 수를 출력하는 문제다.
이 때 회전이란 [0, 1, 2] 가 있을 때 1번 회전하면 [2, 0, 1], 2번 회전하면 [1, 2, 0]이 된다.
시간복잡도 안에 해결해야 한다.
회전이 되어있더라도 정렬되어있다는 점과, 시간복잡도가 라는 점에서 이진 탐색이 생각났다.
처음에는 left
와 mid
값을 비교하는 방식으로 풀어봤지만 다음과 같은 상황이 발생했다.
left
값보다 mid
값이 큰 경우: left
~ mid
는 정렬되어 있음.left
값이므로 right
= mid
mid
, right
사이에 있으므로 left
= mid
+1left
값을 비교하는 방법은 포기하고 right
값을 비교해보았다.
class Solution:
def findMin(self, nums: List[int]) -> int:
if nums[0] < nums[-1]:
return nums[0]
left, right = 0, len(nums)-1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[right]:
right = mid
else:
left = mid + 1
return nums[left]
left
, right
를 설정하고 두 값의 중간인 mid
를 계산한다.mid
값보다 right
값이 큰 경우: mid
~ right
는 정렬되어 있음 = 최솟값이 mid
+1과 right
사이에 존재하지 않음.mid
값이 right
값보다 큰 경우: mid
~ right
는 정렬되어 있지 않음 = 최솟값이 mid
와 right
사이에 존재함.left
와 right
가 같아질 때 까지 반복한다.