leetcode153:寻找旋转排序数组中的最小值

题目链接: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也是一样的道理。

注:这个排序是旋转,不是无序的。要做二分,你数组必须有规律,没规律或者无序,二分法绝对不适用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值