easy 搜索插入位置 二分查找

在这里插入图片描述


暴力搜索:

c++


class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int index=0;
        int i=0;
        while(i<nums.size() && nums[i]<=target){
            if (nums[i]==target){
                index = i;
                return index;   // 如果有target,返回index
            }
            i++;
        }
        return i;  /// 如果没有target,返回插入位置
    }
};

python


class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        index = 0
        i=0
        while i<len(nums) and nums[i]<=target:  # c &&, python and
            if nums[i] == target:
                index = i
                return index  # 如果有target,返回index
            i+=1   # python 没有i++ 

        return i   #  如果没有target,返回插入位置



二分查找:

在这里插入图片描述

在这里插入图片描述

c++


class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int l = 0;
        int r = nums.size()-1;
        int mid = 0;
        while(l<=r){
            mid = (l+r)/2;
            if(target == nums[mid]){
                return mid;
            }else if (target < nums[mid]){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return l;
    }
};

python


class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        l, r = 0,len(nums)-1   # 左右下标
        while l<=r:    # 循环条件 左下标小于右下标
            mid = (l+r)//2         # 中间下标 python 向下取整://
            if target == nums[mid]:
                return mid
            elif target < nums[mid]:  # 中间下标对应值 大于 目标值,(二分左短右长)
                r = mid - 1   # 二分右长收缩至 中间下标左一位
            else:
                l = mid + 1   # 二分左长右短,二分左长收缩至 中间下标右一位

        return l


c++ 二分查找函数:

C++ lower_bound 与 upper_bound 函数

头文件: #include
二分查找的函数有 3 个:
lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置。
upper_bound(起始地址,结束地址,要查找的数值) 返回的是 第一个大于待查找数值 出现的位置。
binary_search(起始地址,结束地址,要查找的数值) 返回的是是否存在这么一个数,是一个bool值。
注意:使用二分查找的前提是数组有序。


class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
    return lower_bound(nums.begin(),nums.end(),target) - nums.begin();
    }  
};
// lower_bound 返回的是一个迭代器,它要减去nums.begin()这个迭代器得到的差值才是下标的编号。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值