取数组的中间位置的值:
如果它比数组末尾的值大,说明最小元素就位于[mid + 1, right]之间。//不取mid 是因为已经比末尾的值大
否则,最小元素一定在[left, mid]中// mid 的值不能舍去还有可能成为最小值。
这道题是一个二分法的变形,被二分的边界条件搞得比较晕…
// 旋转数组也是半有序的数组//这里面是没有重复的所以是不可能相等的
class Solution {
public:
int findMin(vector<int>& nums) {
// 在a[l]a[r] 中寻找最小值,这两个值是不可能相等的
int l=0;
int r= nums.size()-1;
while(l<r) // 如果加上等号就会进入死循环//
{
int mid = l+(r-l)/2;
if(nums[mid] <= nums [r])
{
r =mid; //如果mid 小于右侧 说明最小值应该是在左侧,这时候不能舍弃mid 这个值
}
else
l=mid+1; // 如果mid 值大于右侧 说明最小值应该在右侧
}
return nums[l]; // return min(a[left], a[right]);
}
};
感觉最后一句由于是查找最小值如果不清楚返回什么 return min(a[left], a[right]); 直接用这个代替