题目链接:153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] > nums[right])
{
left = mid + 1;
}
else
{
right = mid;
}
}
return nums[left];
}
};
这个题目实际上很不错,很考研思维说实话,毕竟题目见多了才能拓展自己的知识面,这个题目我来讲解一下。
讲解:其实这个数组旋转过来,我们常见的二分代码是nums[mid]和target比较,这个是用nums[mid]和nums[right]来去找最小值。
我们再来区别一下nums[mid]和target的区别,nums[mid]和nums[right]的区别。
nums[mid]和target的功能是,我们在nums数组中找到target的值,这个nums前提是排好序的,而且也只是去寻找target的值
nums[mid]和target的功能是,我们在nums数组中寻找最小值,这个是旋转的数组的,所以用nums[right]来作为判断。
代码讲解:
我们来举例子,7 8 9 10 11 12 0 1 2
这个时候的nums[mid]=11,所以nums[mid]大于nums[right]所以最小值一定在最后边,不在左边,所以这时候要更新left的位置。要是更新right也是一样的道理。
注:这个排序是旋转,不是无序的。要做二分,你数组必须有规律,没规律或者无序,二分法绝对不适用。