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

力扣34题 双二分查找(简单易懂)

力扣34题 双二分查找(简单易懂)

文章目录

  • 力扣34题 双二分查找(简单易懂)
  • 题目描述
  • 思路
  • 代码
  • 总结


题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:你可以设计并实现时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn) 的算法解决此问题吗?

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:

输入:nums = [], target = 0
输出:[-1,-1]


思路

可以用两个二分查找去找出左右边界的值

寻找target在数组里的左右边界,有如下三种情况:

  • 情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}
  • 情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
  • 情况三:target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}

这三种情况都考虑到,说明就想的很清楚了。

代码

class Solution {public int[] searchRange(int[] nums, int target) {int rightBorder = getRightBorder(nums,target);int leftBorder = getLeftBorder(nums,target);if(rightBorder == -2 || leftBorder == -2) return new int[] {-1,-1};if (rightBorder - leftBorder > 1) return new int[]{leftBorder + 1, rightBorder - 1};return new int[] {-1,-1};}int getRightBorder(int[] nums,int target){int left = 0;int right = nums.length - 1;int rightBorder = -2;while(left <= right){int mid = left + (right - left) / 2;if(nums[mid] > target){right = mid - 1;}else{left = mid  + 1;rightBorder = left;}}return rightBorder;}int getLeftBorder(int[] nums,int target){int left = 0;int right = nums.length - 1;int leftBorder = -2;while(left <= right){int mid = left + (right - left) / 2;if(nums[mid] < target){left = mid + 1;}else{right = mid - 1;leftBorder = right;}}return leftBorder;}
}

总结

正如本题解描述,想清楚三种情况之后,先专注于寻找右区间,然后专注于寻找左区间,左右根据左右区间做最后判断

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • go语言的命名规则
  • C#中的Func
  • 探索 IPython %%sql 魔术:数据库交互的高效工具
  • git 使用教程
  • 压测实操--kafka-consumer压测方案
  • 【MSP430】DriverLib库函数,GPIO相关函数介绍
  • 数据传输安全--IPSEC
  • 驱动开发系列07 - 驱动程序如何分配内存
  • Python | Leetcode Python题解之第279题完全平方数
  • ActiViz控件解析及C#实践指南
  • Atlassian Intelligence工具集解析:从自然语言到JQL处理,从虚拟代理到AI摘要、编辑器中的生成式AI等,全方位提升团队协作效率
  • 如何看待LabVIEW数据清洗的重要性?
  • 关于Tk地区
  • 【Zynq UltraScale+ RFSoC】~~~
  • 百度“萝卜快跑”火了!想要饭碗更稳,这个测试技能必会!
  • 【译】理解JavaScript:new 关键字
  • golang 发送GET和POST示例
  • Java教程_软件开发基础
  • Linux Process Manage
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • vue2.0项目引入element-ui
  • Vue组件定义
  • Zepto.js源码学习之二
  • 工作手记之html2canvas使用概述
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 入门级的git使用指北
  • 软件开发学习的5大技巧,你知道吗?
  • 深入浅出webpack学习(1)--核心概念
  • 思维导图—你不知道的JavaScript中卷
  • 延迟脚本的方式
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 容器镜像
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • $refs 、$nextTic、动态组件、name的使用
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ( 10 )MySQL中的外键
  • (11)MATLAB PCA+SVM 人脸识别
  • (BFS)hdoj2377-Bus Pass
  • (CPU/GPU)粒子继承贴图颜色发射
  • (javascript)再说document.body.scrollTop的使用问题
  • (独孤九剑)--文件系统
  • (二)linux使用docker容器运行mysql
  • (二)换源+apt-get基础配置+搜狗拼音
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)【Hibernate总结系列】使用举例
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)hibernate缓存
  • . NET自动找可写目录
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .htaccess配置重写url引擎
  • .NET 8.0 发布到 IIS
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇