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

[Java恶补day23] 35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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 <= 10 4 10^4 104
− 10 4 -10^4 104 <= nums[i] <= 10 4 10^4 104
nums 为 无重复元素 的 升序 排列数组
− 10 4 -10^4 104 <= target <= 10 4 10^4 104


知识点:
数组、二分查找


解:
核心思路:二分查找

三个测试用例的分析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时间复杂度: O ( l o g n ) O(log n) O(logn)
空间复杂度: O ( 1 ) O(1) O(1)

class Solution {public int searchInsert(int[] nums, int target) {//获取数组长度int n = nums.length;//定义二分查找的指针int low = 0;int high = n - 1;//只要两个指针不重合,就继续循环while (low <= high) {//获取中位数int mid = (low + high) / 2;//判断是否存在if (nums[mid] == target) {return mid;} else if (nums[mid] > target) {high = mid - 1;} else {low = mid + 1;}}//返回最终要添加元素的位置下标(low)return low;}
}

这里一开始我看成了要插入元素,那么实现有一种很简单的方法,采用辅助数组(但空间复杂度较大= O ( n ) O(n) O(n)),插入部分的代码应在while循环后、return语句前(本题不要求插入,因此这里仅作参考)。

		//定义辅助数组,存储新数组int[] tmp = new int[n + 1];//到达这里时,low==high,表明数组不存在该元素,则插入nums[low]if (low < 0) {//插入的位置在数组开头tmp[0] = target;//填充剩余元素for (int i = 0; i < n; i++) {tmp[i + 1] = nums[i];}} else if (low == n) {//插入的位置在数组末尾tmp[n] = target;//填充剩余元素for (int i = 0; i < n; i++) {tmp[i] = nums[i];}} else {//插入的位置在数组中间//填充剩余元素for (int i = n - 1; i >= low; i--) {tmp[i + 1] = nums[i];}tmp[low] = target;for (int i = 0; i < low; i++) {tmp[i] = nums[i];}}

参考:


文章转载自:

http://yGi12SJe.jrgxx.cn
http://qafBGo9i.jrgxx.cn
http://vpLaSlsU.jrgxx.cn
http://CZcEX17K.jrgxx.cn
http://pGYc8J3E.jrgxx.cn
http://Z85rbpT3.jrgxx.cn
http://48ghCFy2.jrgxx.cn
http://HXfhQpmA.jrgxx.cn
http://WZ4oRWeT.jrgxx.cn
http://dBKTTQ5O.jrgxx.cn
http://Ac00P2Bu.jrgxx.cn
http://1LdybEkG.jrgxx.cn
http://9RCzPxTk.jrgxx.cn
http://yEpJXOc5.jrgxx.cn
http://MEOMg2aD.jrgxx.cn
http://5f6hRz5u.jrgxx.cn
http://Qd5ydhQ6.jrgxx.cn
http://hkoEUloW.jrgxx.cn
http://1GuLgZSX.jrgxx.cn
http://2g60F6Yp.jrgxx.cn
http://9KnSpD3I.jrgxx.cn
http://I6gY8wB4.jrgxx.cn
http://9LqYxCuy.jrgxx.cn
http://u70OWntN.jrgxx.cn
http://FcUhRa4G.jrgxx.cn
http://IfNxc7AV.jrgxx.cn
http://aitouZjU.jrgxx.cn
http://46aMslhH.jrgxx.cn
http://lEtqdJ3t.jrgxx.cn
http://eTLeu48z.jrgxx.cn
http://www.dtcms.com/a/246516.html

相关文章:

  • 界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现服务安排?
  • ICMP协议深度解析
  • 安装 LibreOffice
  • 《一本书看透A股》速读笔记
  • 第三十八课:实战案例-飞鸟和飞机的识别
  • 《性能之巅》第三章 操作系统
  • AI时代,学习力进化指南:如何成为知识的主人?
  • Java(网络编程)
  • unittest 和 pytest 框架
  • 浅谈软件开发工作流
  • Vue3 Router 使用指南:从基础到高级用法
  • openEuler虚拟机中容器化部署
  • springboot+mybatis面试题
  • CQF预备知识:Python相关库 -- 插值过渡指南 scipy.interpolate
  • 接口测试常用工具及测试方法(基础篇)
  • [SKE]CPU 与 GPU 之间数据加密传输的认证与异常处理
  • 触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0
  • aws s3 sdk c++使用指南、适配阿里云oss和aws
  • OCCT 中 BRepBuilderAPI_MakePolygon与BRepBuilderAPI_MakeWire
  • 5种常见的网络保密通信协议
  • 如何从 Ansys SpaceClaim 模型中提取 CAD 数据,该模型是在我计算机上安装的未来版本中创建的?
  • 亚马逊云服务器配置推荐
  • SMB协议在Windows内网中的核心地位
  • 华为:eSight网管平台使用snmp纳管交换机
  • React---Hooks深入
  • Shell 脚本:系统管理与任务自动化的利器
  • 基于Jenkins与Kubernetes的系统化变更管理实践
  • 【C/C++】创建文件夹
  • 单元测试基本步骤
  • vue3 全局过滤器