当前位置: 首页 > news >正文

二分查找的应用

什么时候用二分查找?

数据具有二段性的时候

第一题:

 题解代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0,right = nums.size()-1;
        while(left<=right){
            int mid = left+ (right-left)/2;//中间,left+区间长度
            if(nums[mid]>target){
                right = mid-1;
            }
            else if(nums[mid]<target){
                left = mid+1;
            }
            else return mid;
        }
        return -1;
    }
};

总结朴素二分查找的模板:


       
        while(left<=right){//切记这里是<=
            int mid = left+ (right-left)/2;//防止溢出的写法
            if(..........){
                right = mid-1;
            }
            else if(............){
                left = mid+1;
            }
            else return ........;
        }
   

第二题:

题解代码:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        //特殊处理
        if(nums.size() == 0) return {-1,-1};
        int left = 0,right = nums.size()-1;
        int begin = 0;
        //二分⬅左端点
        while(left<right){
            //求中间
            int mid = left+(right-left)/2;
            if(target>nums[mid]) left = mid +1;
            else right = mid;
        }
        //判断是否有结果
        if(nums[left] != target) return {-1,-1};
        else begin = left;
        //二分右端点
        right  = nums.size()-1;
        while(left<right){
            int mid = left+(right-left+1)/2;
            if(target>= nums[mid]) left = mid;
            else right = mid-1;
        }
        return {begin,right};
    }
};

总结二分模板:

1、查找区间左端点的模板

//查找区间左端点的模板 
while(left<right){
            //求中间
            int mid = left+(right-left)/2;
            if(、、、、、、) left = mid +1;
            else right = mid;
        }

2、查找区间有端点的模板:


while(left<right){
            int mid = left+(right-left+1)/2;
            if(、、、、、) left = mid;
            else right = mid-1;
        }

3、帮助记忆的几句话:

1、下面用减上面就用加1;

2、下面按情况讨论;

第三题: 

题解代码:

class Solution {
public:
    int mySqrt(int x) {
        //处理特殊的额情况
        if(x<1) return 0;
        int left = 1,right = x;
        //固定的模板 
        while(left<right){
            long long mid = left+(right-left+1)/2;
            if(mid*mid<=x) left = mid;
            else right = mid-1;
        }
        return left;
    }
};

 第四题:

题解代码:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0,right = nums.size()-1;
        while(left<right){
            int mid = left+(right-left)/2;
            if(nums[mid]>= target) right = mid;
            else left = mid+1;
        }
        //处理一下特殊的情况
        if(nums[left]< target) return nums.size();
        return left;
    }
};

第五题:

题解思路:

 

所以代码如下:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        //分析:峰顶的元素一定严格大于前一个数,但是不一定大于后面的元素;
        int left = 1,right = arr.size()-2;
        //查找的位置的元素一定大于前面一个,小于或者等于后面一个
        while(left<right){
            int mid = left+(right-left+1)/2;
            if(arr[mid]>arr[mid-1]) left = mid;
            else right = mid-1;
        }
        return left;
    }
};

 

相关文章:

  • numpy学习笔记3:三维数组 np.ones((2, 3, 4)) 的详细解释
  • 汽车相关液体介绍
  • MinIO Docker
  • Linux性能监控工具nmon安装及使用
  • 3.20-1ui自动化切换,登录退出
  • Object 转 JSONObject 并排除null和““字符串
  • 应急响应笔记
  • stm32 2.0.3.0
  • python-leetcode 60.分割回文串
  • K8S中若要挂载其他命名空间中的 Secret
  • h265 flv.js组件封装Vue3
  • 【软考-架构】8.4、信息化战略规划-CRO-SCM-应用集成-电子商务
  • 【Linux】VMware17 安装 Ubuntu24.04 虚拟机
  • Ubutu20.04安装docker与docker-compose
  • Spring Boot 异步返回对象深度解析
  • #pandas #python#数据标注 pd.crosstab()
  • STM32U575RIT6单片机(四)
  • 嵌入式c学习七
  • 企业架构与IT方法论:现代企业的基石
  • SQLark 实战 | 如何通过对象名和 DDL 快速搜索数据库对象
  • 被围观的“英之园”,谁建了潮汕天价违建?
  • 上海交大曾小勤:科技传播不应停留于知识搬运,要做科学思维的播种机
  • 首映|《星际宝贝史迪奇》真人电影,不变的“欧哈纳”
  • 尹锡悦宣布退出国民力量党
  • 戛纳打破“疑罪从无”惯例,一法国男演员被拒之门外
  • “9+2”复式票,浦东购彩者拿下体彩大乐透1153万头奖