320x100
문제 : https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
오름차순 정렬된 배열이 있을 때, 어떤 pivot으로 배열이 회전했다고 하자.
ex) [0,1,2,3,4,5,6,7] -> [4,5,6,7,0,1,2,3]
회전된 배열이 주어질 때 가장 작은 수를 구하라. 배열안에 수는 중복될 수 있다.
33번 Search in Rotated Sorted Array 와 비슷하게 풀었다.
위 문제와 다른 점은 33번 문제는 회전된 배열에서 특정 수 target을 찾고 배열은 중복된 수가 없다.
왼쪽 | 오른쪽 | 배열 |
오름차순 | 오름차순 | 오름차순 (제일 작은수가 왼쪽에 위치) |
오름차순 | 내림차순 | 제일 작은수가 오른쪽에 위치 |
내림차순 | 오름차순 | 제일 작은수가 왼쪽에 위치 |
내림차순 | 내림차순 | 내림차순 (제일 작은수가 오른쪽에 위치) |
그래서 기본적으로는 위 표를 보고 작은수가 있는 곳으로 탐색범위를 줄여가면서 가장 작은수를 찾아나갈 수 있다. (binary search).
그러나 오름차순인지 내림차순인지 확인을 위한 nums[처음], nums[중간], nums[마지막] 값들을 비교할 때 이들 중 같은 수가 나온다면 위와 같은 방법으로는 확인할 수 없다. ex) 1, 1, 1, 0, 1
따라서 nums[처음] = nums[중간] 이거나 nums[중간] = nums[마지막] 인 경우 분할정복으로 배열을 반 나누고 두 배열을 모두 탐색해나간다.
시간복잡도는 O(NlogN).
여담이지만 분할정복이나 이진탐색 중 하나만 써도 제한시간 내에 풀 수 있다.
320x100
'알고리즘 문제 > Leetcode' 카테고리의 다른 글
[leetcode][621] Task Scheduler (0) | 2020.08.01 |
---|---|
[leetcode][309] Best Time to Buy and Sell Stock with Cooldown (0) | 2020.08.01 |
[leetcode][260] Single Number III (0) | 2020.07.24 |
[leetcode][430] Flatten a Multilevel Doubly Linked List (0) | 2020.07.10 |
[leetcode][15] 3Sum (0) | 2020.07.08 |
댓글