Leetcode 35:搜索插入位置

思路:

  1. 时间复杂度要求O(log n),想到二分搜索,这题有一点区别就是返回索引有一点变化。
  2. 程序写法可以分为首尾索引用while逼近缩小,也可以使用函数递归调用返回写。
  3. 需要考虑的几个点,left变化,mid计算=left+(right-left)/2 ,小于left,大于right返回的索引,

普通解法1,函数迭代

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {

        int length=nums.size();
        if(length==0 )
            return 0;
        
        return search(nums,target,0,length-1);
            
    }


    int search(vector<int>& nums, int target,int left,int right){
        int mid=left+(right-left)/2;
        
        if(target<nums[left])
            return left;
        else if(target>nums[right])
            return right+1;
            
        if(target==nums[mid])
            return mid;
        else if(target<nums[mid])
            return search(nums,target,left,mid-1);
        else 
            return search(nums,target,mid+1,right);
        
    }
};

普通解法2,二分循环

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {

        int left=0;
        int right=nums.size()-1;

        while(left<=right){
            if(target<=nums[left+(right-left)/2])
                right=left+(right-left)/2-1;
            else
                left=left+(right-left)/2+1;
        }
        return left;

    }

};

关于lower_bound( )和upper_bound( )的常见用法

一行程序解法,

return lower_bound(nums.begin(),nums.end(),target) - nums.begin();

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值