算法篇二----二分查找

1、

分析:a、x<t---->left = mid+1

b、x>t------>right = mid -1

c、x=t----->返回结果

细节问题:a、循环结束的条件

left<right

b、时间复杂度logN

cpp 复制代码
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;
            if(nums[mid]<target)
            left=mid+1;
            else if(nums[mid]>target)
            right=mid-1;
            else
            return mid;
        }
        return -1;
        
    }
};

那么就可以总结模板

cpp 复制代码
while(left<=right)
{
    int mid = left+(right-left)/2;
    if(...)
    left=mid+1;
    else if(...)
    right=mid-1;
    else
    return ...;
}

注意二段性

2、

一、查找区间的左端点

根据二段性

1>x<t---->left = mid+1----->left,right

2>x>=t------>right = mid------>left,right

这就是本题思路,但是重点不在这里

细节处理:1>循环条件(left<right)

left<=right 大错特错

分析:a、有结果 b、全大于t c、全小于t

相等时,就是最终结果,无需判断,最坑人的就是,只要判断就会死循环,求中间值依旧是ret,ret不会移动,命中第2>条件,一直循环

2>求中点操作

left+(right-left)/2

二、查找右端点

1>x<t---->left = mid----->left,right

2>x>=t------>right = mid-1------>left,right

细节问题同上

cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.size()==0)
        return {-1,1};

        int begin =0;
        int left=0,right = nums.size()-1;
        while(left<right)
        {
            int mid = left+(right-left)/2;
            if(nums[mid]<target)
            left=mid+1;
            else
            right=mid;
        }
        if(nums[left]!=target)
        return {-1,1};
        else 
        begin left;

        int left=0,right=nums.size()-1;
        while(left<right)
        {
            int mid = left +(right-left+1)/2;
            if(nums[mid]<=target)
            left=mid;
            else
            right = mid-1;
        }
        return {begin,right};
    }
};

查找区间左端点的模板

cpp 复制代码
     while(left<right)
        {
            int mid = left+(right-left)/2;
            if(...)
            left=mid+1;
            else
            right=mid;
        }

查找区间右端点的模板

cpp 复制代码
while(left<right)
        {
            int mid = left+(right-left+1)/2;
            if(...)
            left=mid;
            else
            right=mid-1;
        }

小技巧:当下面出现-1的时候,上面就+1

以上就是二分查找的模型,再用几个例题加深理解

3、

cpp 复制代码
class Solution {
public:
    int mySqrt(int x) {
        if(x<1)
        return 0;
        int left = 1,right=x;
        while(left<right)
        {
            int mid = left+(right-left+1)/2;
            if(mid*mid<=x)
            left=mid;
            else
            right= mid-1;
        }
        return left;

    }
};

4、

cpp 复制代码
         
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;

    }
};
相关推荐
音符犹如代码2 分钟前
Kafka 接入 AI 的三条路线:MCP 提案、会话记忆与实时上下文
java·大数据·ai·kafka
Omics Pro2 分钟前
1个月2轮融资!长寿虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
residual_fan2 分钟前
航空发动机故障诊断专用智能体(六):实际机队健康管理中的应用考量与展望
人工智能·算法·数据挖掘·数据分析
vx_BS813305 分钟前
【项目编号:project51629】Spring Boot 乡村自来水缴费系统:把抄表、水费生成与在线缴费做成一条数字化闭环
java·spring boot·eclipse·tomcat·maven
qq_2695067514 分钟前
第29课-Servlet基础
java
hansang_IR24 分钟前
【讲解】CSP-S2026 第一轮初赛
c++·算法
毅炼25 分钟前
不写多语言 SDK,怎么让 Python、Go、Node 服务接入注册中心?
java·后端·系统架构·gateway
hanlin0327 分钟前
刷题笔记:力扣第76题-最小覆盖子串
笔记·算法·leetcode
Zane199428 分钟前
比较排序跑不出O(nlogn)是数学上证明过的,计数、桶、基数排序凭什么能绕开这堵墙
算法·排序算法
tiger86529 分钟前
大语言模型面试和题解,梳理中国主流开源 LLM 系列的发展脉络、技术路线与工程取舍
人工智能·gpt·深度学习·算法·自然语言处理·面试·transformer