https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/description/
还是最常见的面试题,感觉我写的不干净
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
if (left == right) return nums[left];
if (nums[left] == nums[right]) {
left ++;
// right --; //不能加这个 反例 1 2 1,如果left ++ right -- 那么最小值被忽略了
} else {
int mid = (left + right) / 2;
if (mid && nums[mid] < nums[mid-1]) return nums[mid];
if (nums[mid] == nums[right]) {
right --;
} else {
if (nums[mid] < nums[right]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
}
}
return nums[left];
}
};
一个好看点的代码 https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/discuss/48808/My-pretty-simple-code-to-solve-it
class Solution {
public:
int findMin(vector<int> &num) {
int lo = 0;
int hi = num.size() - 1;
int mid = 0;
while(lo < hi) {
mid = lo + (hi - lo) / 2;
if (num[mid] > num[hi]) {
lo = mid + 1;
}
else if (num[mid] < num[hi]) {
hi = mid;
}
else { // when num[mid] and num[hi] are same
hi--;
}
}
return num[lo];
}
};
When num[mid] == num[hi], we couldn’t sure the position of minimum in mid’s left or right, so just let upper bound reduce one.