排序-二分查找

例题:

  • 寻找旋转排序数组中的最小值
    网址:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
    前沿: 下面给出两种解法,分别从两个角度:
  • 常规想法,考虑的性质是:序列中最小的数据要么是第一个要么是第一个左边数据大于右边的位置
  • 二分查找的方式

方法1:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int n = nums.size();
        if(n==1) return nums[0];
        int tmp = nums[0];
        auto iter = nums.begin();
        nums.insert(iter, *iter-1);    //增加一个开头数
        iter = nums.begin()+1;
        for(;iter!=nums.end();iter++){
            if(*prev(iter,1)>*iter){
                tmp = *iter;
                break;
            }
        }
        return tmp;
    }
};

注意点:采用容器的prev函数获取前一个的地址,所以用迭代器的时候需要考虑增加一个无用的开头新数。

方法2:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int n = nums.size();
        if(n==1) return nums[0];
        int low = 0;
        int high = n-1;
        while(low<high){
            int mid = low + (high - low)/2;
            if(nums[mid]<nums[high])
                high = mid;
            else 
                low = mid+1;
        }
        return nums[low];
    }
};

注意点:这里面二分注意点就是中间元素和最后一个元素的判断关系,如果中间元素小于最后元素,那么mid右边去掉;否则左边去掉。

总结:

  1. 二分查找的使用条件就是有序,这个有序其实不一定是全部有序,类似本题就是局部有序;
  2. 考虑实际情况的对比,应该和谁做比较;
  3. 终止条件:我之前的误区就是二分的终止应该是循环内部终止,其实还有一种指针走到结束位置的终止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值