154. find minimum in rotated sorted array ii 解法 相关题目

154. Find Minimum in Rotated Sorted Array II

Difficulty: Hard

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,  [0,1,2,4,5,6,7] might become  [4,5,6,7,0,1,2]).

Find the minimum element.

The array may contain duplicates.

Example 1:

1
2
Input: [1,3,5]
Output: 1

Example 2:

1
2
Input: [2,2,2,0,1]
Output: 0

Note:

  • This is a follow up problem to .
  • Would allow duplicates affect the run-time complexity? How and why?

解法

  这道题和其他三道rotated array的题都很经典,很有启发性,提醒我们要活用二分搜索,不要死记硬背套模板。

  解法的核心是nums[mid] > nums[begin] or nums[mid] > nums[end]和nums[mid] < nums[end] or nums[mid] < nums[begin]和nums[mid] == nums[end] == nums[begin]三者必然只有一个成立。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class :
def findMin(self, nums: List[int]) -> int:
begin = 0
end = len(nums) - 1
while begin < end:

mid = begin + (end - begin) // 2

if nums[mid] > nums[begin] or nums[mid] > nums[end]:
if nums[mid] > nums[end]:
begin = mid + 1
else:
return nums[begin]
elif nums[mid] < nums[end] or nums[mid] < nums[begin]:
if nums[mid] < nums[begin]:
end = mid
else:
return nums[begin]
else:
end -= 1

return nums[begin]

相关题目

以下解法都来自https://www.happygirlzt.com/post/rotatedsortedarray/

33. Search in Rotated Sorted Array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class  {
public int search(int[] nums, int target) {
int n = nums.length;
int lo = 0, hi = n - 1;

while (lo <= hi) {
int mid = lo + (hi - lo) / 2;

if (nums[mid] == target) return mid;

// [3, 1], target is 1
if (nums[lo] <= nums[mid]) {
if (target > nums[mid] || target < nums[lo]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
} else {
if (target < nums[mid] || target > nums[hi]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
}
}

return -1;
}
}

81. Search in Rotated Sorted Array II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class  {
public boolean search(int[] nums, int target) {
int n = nums.length;
int lo = 0, hi = n - 1;

while (lo <= hi) {
int mid = lo + (hi - lo) / 2;

if (nums[mid] == target) return true;

if (nums[lo] < nums[mid] || nums[mid] > nums[hi]) {
if (target > nums[mid] || target < nums[lo]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
} else if (nums[mid] < nums[hi] || nums[lo] > nums[mid]) {
if (target < nums[mid] || target > nums[hi]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
} else {
hi--;
}
}

return false;
}
}

153. Find Minimum in Rotated Sorted Array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class  {
public int findMin(int[] nums) {
int n = nums.length;
if (nums[0] < nums[n - 1]) return nums[0];

int lo = 0, hi = n - 1;
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (mid > 0 && nums[mid] < nums[mid - 1]) {
return nums[mid];
}

if (nums[mid] > nums[mid + 1]) {
return nums[mid + 1];
}

if (nums[lo] < nums[mid]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}

// when the size of nums is 1, will reach here
return nums[lo];
}
}