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

LeetCode二分查找

搜索插入位置

description

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104

idea

算法真是优雅的艺术~虽然我还很粗糙!
搜索指定数据位置,找不到则返回需要插入的位置。
因为加了小小的变动:找不到返回应该插入的位置。已知数组升序,我们可以把问题转换为找到首个大于等于target的位置

solution

class Solution {public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1, ans = nums.length;while(left <= right){int mid = (left + right) / 2;if(target > nums[mid]) left = mid + 1;else{ans = mid;right = mid - 1;} }return ans;}
}

在排序数组中查找元素的第一个和最后一个位置

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

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

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 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]

提示:

0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109

idea

类似上一题,升序数组中查找元素,联想到用二分查找。
需要找元素首次出现和最后一次出现的位置,可以把基本的二分查找转化为找最左(右)出现的位置。

solution

class Solution {public int[] searchRange(int[] nums, int target) {int[] ans =   {getPos(nums, target, 0), getPos(nums, target, 1)};return ans;}public int getPos(int[] nums, int target, int flag){int left = 0, right = nums.length - 1, ans = -1;while(left <= right){int mid = (left + right) / 2;if(nums[mid] == target){ans = mid;if(flag == 0) right = mid - 1;else left = mid + 1;}else if(nums[mid] > target) right = mid - 1;else left = mid + 1;}return ans;}
}
http://www.lryc.cn/news/209723.html

相关文章:

  • 米软科技客户单病种上报量云南省第一
  • SpringCore完整学习教程5,入门级别
  • 1024 云上见 · 上云挑战(ChatGPT搭建)
  • Linux内核代码中常用的数据结构
  • 自动驾驶,从“宠儿”走进“淘汰赛”
  • Tensorflow2 中模型训练标签顺序和预测结果标签顺序不一致问题解决办法
  • uniapp 在 Android Studio 模拟器中运行项目
  • 淘宝API接口获取商品信息,订单管理,库存管理,数据分析
  • Azure - 机器学习企业级服务概述与介绍
  • Linux docker 安装 部署
  • selenium+python web自动化测试框架项目实战实例教程
  • 软考高级系统架构设计师系列之:案例分析典型试题七
  • 【算法|动态规划No30】leetcode5. 最长回文子串
  • 计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理
  • kubectl资源管理命令-陈述式
  • Android-宝宝相册(第四次作业)
  • Android应用:实现网络加载商品数据【OKHttp、Glide、Gson】
  • 增强常见问题解答搜索引擎:在 Elasticsearch 中利用 KNN 的力量
  • 常见网络攻击及防御方法总结(XSS、SQL注入、CSRF攻击)
  • python爬虫request和BeautifulSoup使用
  • 记录--vue3实现excel文件预览和打印
  • 消息队列中间件面试笔记总结RabbitMQ,Kafka,RocketMQ
  • pycharm远程连接Linux服务器
  • Android应用开发(38)全屏显示隐藏状态栏和导航栏
  • 日本IT Week秋季展丨美格智能以技术创新共建美好数字生活
  • centos7 install postgres-15
  • JVM常见的垃圾回收器(详细)
  • acwing 5283. 牛棚入住
  • Qt触摸屏双指缩放和单指移动界面(支持嵌入式设备)
  • 【Linux】虚拟机安装Linux、客户端工具,MobaXterm的使用,Linux常用命令