广州企业网站开发南昌网页制作公司

张小明 2026/1/10 0:39:11
广州企业网站开发,南昌网页制作公司,wordpress 4.9.2漏洞,wordpress微信群大全二分查找是高效解决有序/局部有序数组问题的经典算法#xff0c;核心思想是通过不断缩小“可能包含目标的区间”#xff0c;将时间复杂度从暴力遍历的 O(n)O(n)O(n) 优化到 O(log⁡n)O(\log n)O(logn)。 它的适用场景非常广泛#xff1a;不仅能解决“查找目标值”这类基础问…二分查找是高效解决有序/局部有序数组问题的经典算法核心思想是通过不断缩小“可能包含目标的区间”将时间复杂度从暴力遍历的O(n)O(n)O(n)优化到O(log⁡n)O(\log n)O(logn)。它的适用场景非常广泛不仅能解决“查找目标值”这类基础问题还能处理“找边界”“找极值”“旋转数组”等复杂场景。本文将通过7道经典题目拆解二分查找在不同场景下的解题思路与代码实现。一、在排序数组中查找元素的第一个和最后一个位置题目描述给定非递减排序的整数数组nums和目标值target找出target在数组中的开始位置和结束位置若不存在则返回[-1, -1]。要求时间复杂度为O(log⁡n)O(\log n)O(logn)。示例输入nums [5,7,7,8,8,10], target 8输出[3,4]输入nums [5,7,7,8,8,10], target 6输出[-1,-1]解题思路通过两次二分查找分别确定左边界和右边界找左边界二分找第一个等于target的位置。若nums[mid] target左指针右移否则右指针左移最终左指针即为左边界。找右边界二分找最后一个等于target的位置。若nums[mid] target左指针右移否则右指针左移最终右指针即为右边界。若左边界对应的元素不是target直接返回[-1,-1]。完整代码classSolution{public:vectorintsearchRange(vectorintnums,inttarget){if(nums.size()0)return{-1,-1};intbegin0;intleft0,rightnums.size()-1;// 找左边界while(leftright){intmidleft(right-left)/2;if(nums[mid]target)leftmid1;elserightmid;}if(nums[left]!target)return{-1,-1};elsebeginleft;// 找右边界rightnums.size()-1;while(leftright){intmidleft(right-left1)/2;if(nums[mid]target)leftmid;elserightmid-1;}return{begin,right};}};复杂度分析时间复杂度O(log⁡n)O(\log n)O(logn)两次二分查找各占O(log⁡n)O(\log n)O(logn)。空间复杂度O(1)O(1)O(1)仅用常数级额外变量。二、x 的平方根题目描述给定非负整数x计算并返回其算术平方根的整数部分舍去小数部分不允许使用内置指数函数或运算符。示例输入x 4输出2输入x 8输出28的平方根是2.828…取整数部分解题思路通过二分查找找最大的整数mid使得mid² x边界条件若x 1直接返回0否则二分区间为[1, x]。二分过程计算mid left (right - left 1) / 2避免死循环用long long存储mid * mid防止整数溢出若mid * mid x左指针右移保留当前候选值否则右指针左移。完整代码classSolution{public:intmySqrt(intx){if(x1)return0;intleft1,rightx;while(leftright){longlongmidleft(right-left1)/2;if(mid*midx)leftmid;elserightmid-1;}returnleft;}};复杂度分析时间复杂度O(log⁡x)O(\log x)O(logx)二分区间大小为x每次缩小一半。空间复杂度O(1)O(1)O(1)仅用常数级额外变量。三、搜索插入位置题目描述给定排序数组nums和目标值target找到target在数组中的索引若不存在则返回其按顺序插入的位置。要求时间复杂度为O(log⁡n)O(\log n)O(logn)。示例输入nums [1,3,5,6], target 5输出2输入nums [1,3,5,6], target 2输出1解题思路通过二分查找找第一个大于等于target的位置若nums[mid] target说明target在右边左指针右移否则右指针左移。最终左指针即为目标位置若nums[left] target则插入到left1否则插入到left。完整代码classSolution{public:intsearchInsert(vectorintnums,inttarget){intleft0,rightnums.size()-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]target)leftmid1;elserightmid;}returnnums[left]target?left1:left;}};复杂度分析时间复杂度O(log⁡n)O(\log n)O(logn)二分遍历数组。空间复杂度O(1)O(1)O(1)仅用常数级额外变量。四、山脉数组的峰顶索引题目描述给定山脉数组arr先递增后递减返回峰值元素的下标要求时间复杂度为O(log⁡n)O(\log n)O(logn)。示例输入arr [0,1,0]输出1输入arr [0,2,1,0]输出1解题思路山脉数组的峰值满足arr[mid] arr[mid-1]且arr[mid] arr[mid1]通过二分缩小范围二分区间为[1, arr.size()-2]避免越界比较arr[mid]和arr[mid-1]若arr[mid] arr[mid-1]说明峰值在右边左指针右移。否则说明峰值在左边右指针左移。最终左指针即为峰值下标。完整代码classSolution{public:intpeakIndexInMountainArray(vectorintarr){intleft1,rightarr.size()-2;while(leftright){intmidleft(right-left1)/2;if(arr[mid]arr[mid-1])leftmid;elserightmid-1;}returnleft;}};复杂度分析时间复杂度O(log⁡n)O(\log n)O(logn)二分遍历数组。空间复杂度O(1)O(1)O(1)仅用常数级额外变量。五、寻找峰值题目描述峰值元素是指严格大于左右相邻值的元素给定数组nums返回任意一个峰值的下标。假设nums[-1] nums[n] -∞要求时间复杂度为O(log⁡n)O(\log n)O(logn)。示例输入nums [1,2,3,1]输出2输入nums [1,2,1,3,5,6,4]输出1或5解题思路利用“边界为负无穷”的假设通过二分找峰值二分区间为[0, nums.size()-1]比较nums[mid]和nums[mid1]若nums[mid] nums[mid1]说明峰值在左边包括mid右指针左移。否则说明峰值在右边左指针右移。最终左指针即为峰值下标必然存在峰值。完整代码classSolution{public:intfindPeakElement(vectorintnums){intleft0,rightnums.size()-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]nums[mid1])rightmid;elseleftmid1;}returnleft;}};复杂度分析时间复杂度O(log⁡n)O(\log n)O(logn)二分遍历数组。空间复杂度O(1)O(1)O(1)仅用常数级额外变量。六、寻找旋转排序数组中的最小值题目描述给定升序旋转后的数组nums元素互不相同返回数组中的最小元素要求时间复杂度为O(log⁡n)O(\log n)O(logn)。示例输入nums [3,4,5,1,2]输出1输入nums [4,5,6,7,0,1,2]输出0解题思路旋转后的数组分为“左升序段”和“右升序段”最小值是右段的第一个元素二分区间为[0, nums.size()-1]比较nums[mid]和nums.back()最后一个元素若nums[mid] nums.back()说明mid在左段最小值在右边左指针右移。否则说明mid在右段最小值在左边包括mid右指针左移。最终左指针即为最小值的下标。完整代码classSolution{public:intfindMin(vectorintnums){intleft0,rightnums.size()-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]nums[nums.size()-1])leftmid1;elserightmid;}returnnums[left];}};复杂度分析时间复杂度O(log⁡n)O(\log n)O(logn)二分遍历数组。空间复杂度O(1)O(1)O(1)仅用常数级额外变量。七、点名题目描述班级n位同学的学号为0~n-1点名结果记录于升序数组records仅一位同学缺席返回其学号。示例输入records [0,1,2,3,5]输出4输入records [0,1,2,3,4,5,6,8]输出7解题思路正常情况下records[mid] mid缺席的学号会打破该关系二分区间为[0, records.size()-1]比较records[mid]和mid若records[mid] mid说明缺席在右边左指针右移。否则说明缺席在左边包括mid右指针左移。最终若records[left] left缺席学号为left1否则为left。完整代码classSolution{public:inttakeAttendance(vectorintrecords){intleft0,rightrecords.size()-1;while(leftright){intmidleft(right-left)/2;if(records[mid]mid)leftmid1;elserightmid;}returnrecords[left]left?left1:left;}};复杂度分析时间复杂度O(log⁡n)O(\log n)O(logn)二分遍历数组。空间复杂度O(1)O(1)O(1)仅用常数级额外变量。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

电子商城网站开发合同h5页面有哪些

Jetson Nano部署YOLO模型:3步解决PyTorch兼容性问题 【免费下载链接】ultralytics ultralytics - 提供 YOLOv8 模型,用于目标检测、图像分割、姿态估计和图像分类,适合机器学习和计算机视觉领域的开发者。 项目地址: https://gitcode.com/G…

张小明 2026/1/7 21:50:15 网站建设

徐州企业网站设计公司网站被百度收录

nVisual拓扑监测支持网元对象与机房机柜物理设备、业务流程图进行关联映射,全位展示监测对象的关系视图,提高故障排查效率与业务保障能力。 1、网元对象实时显示对象online/offline状态; 2、选中网元图标,点击右侧“监测”&#…

张小明 2026/1/7 21:50:15 网站建设

深圳公司网站设计公司莆田网站建设培训

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个TypeScript项目效率对比分析工具,能够:1) 对使用any和显式类型的相同项目进行并行测试 2) 测量开发速度、调试时间和重构成本 3) 统计类型相关错误数…

张小明 2026/1/7 21:50:16 网站建设

专业点网站制作公司新app推广方案

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

张小明 2026/1/7 21:50:17 网站建设

《电子商务网站开发》实验报告能够做代理的网站有哪些

第一章:Open-AutoGLM架构概述Open-AutoGLM 是一个面向自动化自然语言任务的开源大语言模型架构,旨在融合生成式推理与逻辑规划能力,实现从用户指令到结构化执行路径的端到端映射。该架构基于模块化解耦设计,支持动态任务分解、工具…

张小明 2026/1/9 10:40:24 网站建设

竹子系统做的网站可以优化么网站开发行业标准

基于Docker的PyTorch环境推荐:PyTorch-CUDA-v2.6镜像详解 在深度学习项目中,最让人头疼的往往不是模型调参或数据清洗,而是“为什么代码在我机器上跑得好好的,在服务器上却报错?”——这种经典的“在我这儿没问题”困境…

张小明 2026/1/7 1:41:07 网站建设