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

34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

二分查找到目标值然后左右找到坐标

问题在于:找左右坐标的时候时间复杂度不是O(logN)

class Solution {public int[] searchRange(int[] nums, int target) {int[] ans = {-1, -1};if (nums.length == 0) return ans;int l = 0, r = nums.length;while (l < r) {int m = (l + r) / 2;if (nums[m] == target) {ans[0] = m; ans[1] = m;int tempm = m;while (m > 0 && nums[m - 1] == target) {ans[0] = --m;}while (tempm < nums.length - 1 && nums[tempm + 1] == target) {ans[1] = ++tempm;}break;} else if (nums[m] < target) {l = m + 1;} else {r = m;}}return ans;}
}

之前提到过二分查找不仅可找到相等的数值,更关键的是它可以将数组分为截然不同的两种情况,因此我们可以借助这个性质找到第一个大于等于target的值(左下标)第一个大于target的值(右下标需要-1)(两次二分查找)

找到第一个>=x的值和找到第一个>x的值见:

2258. 逃离火灾(附:二分查找的理解)

class Solution {public int[] searchRange(int[] nums, int target) {int[] ans = {-1, -1};if (nums.length == 0) return ans;int lIndex = func(0, nums.length, nums, target);int rIndex = func(0, nums.length, nums, target + 1) - 1;if (lIndex <= rIndex) ans = new int[] {lIndex, rIndex};return ans;}public int func(int l, int r, int[] nums, int x) {int res = -1;// 找到第一个大于等于x的下标(left)// 大于等于target正常使用// 大于target相当于大于(target + 1)while (l < r) {int m = (l + r) / 2;if (nums[m] < x) {l = m + 1;} else {r = m;}}res = l;return res;}
}
http://www.lryc.cn/news/284336.html

相关文章:

  • Mysql深度分页优化的一个实践
  • 【JavaEE进阶】 SpringBoot配置⽂件
  • excel 常用函数
  • 【React基础】– JSX语法
  • SpringBoot 项目中后端实现跨域的5种方式!!!
  • Vue3前端开发,provide和enject的基础练习,跨层级传递数据
  • Python 循环结构值while循环
  • MSSQL-识别扩展extended event(扩展事件)中的时间单位
  • vue3中l和vue2中v-model不同点
  • 使用 Swift 代码优化项目编译速度
  • 基于springboot+vue的社区团购系统(前后端分离)
  • three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera
  • Golang 搭建 WebSocket 应用(七) - 性能、可用性
  • Qt 状态机框架:The State Machine Framework (一)
  • 高通平台学习一
  • Python爬虫时被封IP,该怎么解决?四大动态IP平台测评
  • 积分梳状滤波器CIC原理与实现
  • 【项目管理】CMMI-原因分析与解决过程(CAR)
  • 【设计模式】文件目录管理是组合模式吗?
  • 利用appium自动控制移动设备并提取数据
  • day22_236二叉树最近公共祖先_235二叉搜索树(最近公共祖先_701插入一个节点_450删除一个节点)
  • OpenSource - 工具管理器easy-manager-tool
  • Laravel7 + easyWeChat 实现微信公众号支付功能
  • Linux环境下,针对QT软件工程搭建C++Test单元测试环境的操作指南
  • 16k+ start 一个开源的的监控系统部署教程
  • Mermaid使用教程(绘制各种图)
  • OpenAI/ChatGPT Plus 支持的虚拟卡有哪些
  • ARM多核调度器DSU
  • vue解决部署文件缓存方式
  • 游戏开发中的噪声算法