刷题笔记
154. Find Minimum in Rotated Sorted Array II
题目
Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,4,4,5,6,7] might become:
[4,5,6,7,0,1,4] if it was rotated 4 times.
[0,1,4,4,5,6,7] if it was rotated 7 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 that may contain duplicates, return the minimum element of this array.
思路
- 首先判断序列是否是整体有序的,如果是,直接返回第一个值。
- 同样设置isBinarySearchHelpful函数,用来消除左侧可能出现的重复数值的影响。
- 然后就是对剩下的数值进行二分法查找,查找条件与之前的查找最小值类似,唯一的不同在于,return条件要变成mid==right,因为在可重复的这种情况中,不收敛的情况下,nums[mid]是可能等于nums[right]的,这时候要继续判断。
代码实现
class Solution {
public int findMin(int[] nums) {
int left = 0, right = nums.length - 1;
if (isSorted(nums)) return nums[0];
while (left <= right) {
int mid = left + (right - left) / 2;
if (left == nums.length - 1) return nums[left];
if (mid == right) return nums[mid];
if (!isBinarySearchHelpful(nums, left, nums[mid]) && left != mid) {
left++;
continue;
}
if (nums[mid] <= nums[right]) {
right = mid;
} else {
left = mid + 1;
}
}
return -1;
}
private boolean isBinarySearchHelpful (int[] nums, int left, int mid) {
return nums[left] != mid;
}
private boolean isSorted (int[] nums) {
return nums[0] < nums[nums.length - 1];
}
}