面试题11. 旋转数组的最小数字
二分的题好烦人啊。各种边界条件,不同情况,顾此失彼
nums[i] == nums[j]
时为了避免下图这种情况,不能直接让j=m
,而是j--
实际例子是[3,3,1,3]
class Solution {
public:
int minArray(vector<int>& nums) {
int i = 0, j = nums.size() - 1;
while (i < j) {
int m = (i + j) / 2;
cout<<i<<" "<< m <<" "<<j<<endl;
// nums[m]不可能是解,所以是i=m+1,解在[m+1,j]里
if (nums[m] > nums[j]) i = m + 1;
// nums[m]可能是解,所以是j=m,解在[i,m]里
else if (nums[m] < nums[j]) j = m;
else j--;
}
return nums[i];
}
};