尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
二分查找系列一
前言二分查找属于最恶心细节最多最容易写出死循环的算法。但是同是也是很简单的算法因为有模板而且很容易学会。主要应用与数组有序或者无序(有规律)的情况下。模板主要是朴素二分模板、查找左边界的二分模板、查找右边界的二分模板。1.二分查找题目链接704. 二分查找 - 力扣LeetCode思路图这道题就是一道朴素的二分模板。代码实现class Solution { public: int search(vectorint nums, int target) { int left 0, right nums.size()-1; while(left right) { //int mid (right left) / 2; int mid left (right - left 1) / 2; //防溢出 cout left : left - right : right endl; if(nums[mid] target) left mid 1; else if(nums[mid] target) right mid - 1; else return mid; } return -1; } };时空分析时间复杂度时O(logn)底数是2。空间复杂度为O(1)几个变量即可。2.在排序数组中查找第一个和最后一个位置题目链接34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣LeetCode思路图这道题相当于是查找左边界和右边界的结合情况还是有点复杂主要细节太多。需要分别分析很容易写出死循环建议每种情况先自己推荐一遍。上图解释了为什么需要有两个中点公式左端点和右端点是不一样的否则就会死循环。代码实现class Solution { public: vectorint searchRange(vectorint nums, int target) { int n nums.size(); if(!n) return {-1,-1}; int left 0, right n - 1, mid 0; vectorint ret; // 查找左端点 while (left right) { // left right 就是结果 mid left (right - left) / 2; if(nums[mid] target) left mid 1; else right mid; } if(nums[left] ! target) return {-1,-1}; ret.push_back(left); //查找右端点 left 0,right n - 1; while(left right) { mid left (right - left 1) / 2; if(nums[mid] target) right mid - 1; else left mid; } ret.push_back(left); return ret; } };时空分析时间复杂度是O(logn)两个二分查找。空间复杂度为O(1)虽然定义了一个vector但是只会消耗两个整型。3.x的平方根题目链接69. x 的平方根 - 力扣LeetCode思路图从1遍历到n使用二分查找注意循环条件和mid的取值公式不是固定的。需具体问题具体分析。只要不会造成死循环即可。像这里中点公式就只能使用另一个否则就会死循环。做多了你就会发现其实就这点套路。循环条件只能是left right当leftright时就是该值应该退出。代码实现class Solution { public: int mySqrt(int x) { if (!x) return x; int left 1,right x; while(left right) { //必须1防止死循环 int mid left (right - left 1) / 2; // cout left : left - right : right endl; if((long)mid*mid x) right mid - 1; else left mid; } return left; } };时空分析时间复杂度为O(logN)一次二分查找。空间复杂度为O(1)。4.搜索插入位置题目链接LCR 068. 搜索插入位置 - 力扣LeetCode思路图循环条件和中点处理需要特判一下别死循环。其他就没什么细节问题了。自己去推演一遍就很清楚了。代码实现class Solution { public: int searchInsert(vectorint 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 right mid; } if(nums[left] target) return left; else return left 1; } };时空分析时间复杂度为O(logN)一次二分查找完成。空间复杂度为O(1)几个变量即可。5.山脉数组的峰顶索引题目链接852. 山脉数组的峰顶索引 - 力扣LeetCode思路图题目说了一定存在山脉数组所以不用讨论不存在的情况。当二分查找完毕数组应该是一个山顶的形状山顶就是我们要找的结果也就是left right的时候。其次在讨论一下中点公式基本思路就出来了。代码实现class Solution { public: int peakIndexInMountainArray(vectorint arr) { int left 0, right arr.size() - 1; while(left right) { int mid left (right - left) / 2; cout left : left - right : right endl; if(arr[mid] arr[mid1]) right mid; else left mid 1; } return left; } };时空分析时间复杂度为O(logN)一次二分查找即可。空间复杂度为O(1)。
RELATED

相关推荐

Git实战指南:从零开始高效协作开发

Git实战指南:从零开始高效协作开发

最近实习对git使用有感,所以写一个git使用流程记录一下。以及配合使用SourceTree推拉代码流程。1. 第一次获取代码1.1. 获取仓库权限每个公司都有自己的代码仓库,我们要获取公司的代码就得去跟管理员申请一个账号。比如说GitLab的话,公司给你…

📅 2026/9/30 7:21:51
基于springboot057洗衣店订单管理系统设计与实现(源码+文档+部署讲解)

基于springboot057洗衣店订单管理系统设计与实现(源码+文档+部署讲解)

一、运行环境与开发工具​ 1.运行环境 Java:版本需≥8,建议使用 Java JDK 1.8,该版本经过实测运行稳定,其他版本理论上也能兼容。​ MySQL:版本需≥5.7,5.7 或 8.0 版本均可正常使用。​ Node.js&#xf…

📅 2026/9/30 7:21:51
结合 Sobel 算子原理,完整详解斜坡宽度缩减锐化算法(Ramp Width Reduction)

结合 Sobel 算子原理,完整详解斜坡宽度缩减锐化算法(Ramp Width Reduction)

目录 前置:Sobel 算子基础原理 2.1 基于 Sobel 输出,计算灰度指标与梯度指标 2.1.1 扇区分割的目的(和 Sobel 的关联) ①灰度指标 ②梯度指标 ③方向补偿因子S 2.2 像素灰度调整规则(全部判断依托 Sobel 衍生出…

📅 2026/9/30 7:21:51
MORE NEWS

更多资讯

📰

Anaconda虚拟环境底层原理与PyCharm配置真相

1. 为什么你每次在PyCharm里跑代码都报“ModuleNotFoundError”,而同事的项目却稳如泰山? 我见过太多人把Python开发环境搞成“玄学现场”:明明pip install了requests,运行时却提示找不到;换台电脑重装一遍&#xff0c…

📰

基于Packet Tracer的校园网设计与配置:VLAN、路由、DHCP与NAT全解析

简介:通信系统课程设计报告基于Packet Tracer设计校园网,适合通信工程、网络工程等专业学生作为课程设计范文或实验参考。报告按照课程设计标准格式展开,包含设计内容与要求、原理介绍、系统设计及论证、系统仿真、实验过程五大板块&#xff…

📰

Jupyter Notebook环境切换:内核注册与常见报错解决

1. 先搞清楚:Jupyter 里到底有几个“环境” 第一次被 Jupyter 的环境问题坑到,是我在一个新机器上装完 Anaconda,兴冲冲打开 Notebook, import torch 报 ModuleNotFoundError。我明明在终端里 pip install 过了,怎…

📰

存量电站“零熵增”技改评估:30分钟非侵入式数字化焕新

上个月,我去一座投运十四年的用户变电站做技改前评估。业主的诉求很直接:不停机、不改接线、不增加日常维护负担,最好先把改造方向摸清楚。当时我用了一套“轨物洞见”的评估流程,重点就是标题里的“零熵增”三个字。整个过程不到…

📰

校园网课程设计从拓扑到排错:VLAN、DHCP与OSPF配置全解析

简介:这是一份基于Packet Tracer的校园网通信系统课程设计报告,适合通信工程、网络工程等专业学生用于课程设计参考。报告按课程设计标准结构展开,涵盖设计内容与要求、原理介绍、系统设计及论证、系统仿真和实验过程。核心知识点包括校园网整…

📰

Python实现租房数据分析和可视化看板全流程实战

最近有个朋友让我帮忙搭一套租房数据分析和展示系统,核心需求很直接:把某城市的租房信息批量抓下来,算清楚哪个片区租金贵、什么户型性价比高、价格有没有季节波动,最后还要做一个能在浏览器里直接看的可视化看板。这就是那个典型…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬