Nico的刷题日记(二)
35. 搜索插入位置
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
思路
官方题解如下:https://leetcode-cn.com/problems/search-insert-position/solution/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/
对于我这种刚开始刷题的人来说,这道题做起来确实让人头大!我确实是知道用二分法做,但是考虑到了如果数组中只有一个元素怎么办,如果最后遍历得只剩下两个元素怎么办,看了题解后豁然开朗,那么我下面的思路也是按照官方题解进行分析的。
首先给定元素后,我们定义左下标leftIndex和右下标rightIndex,中间元素的下标midIndex根据左下标leftIndex和右下标rightIndex计算得出(注意不要超过int的范围)。
int leftIndex = 0;
int rightIndex = nums.length - 1;
int mid = leftIndex + (rightIndex - leftIndex)/2;
当mid的值小于target时,说明我们要找的范围在mid右侧,所以将leftIndex右移一位
if(mid < target){leftIndex = midIndex + 1;
}
当mid的值大于target时,说明我们要找的范围在mid左侧,所以将rightindex左移一位
if(mid > target){rightIndex = midIndex - 1;
}
当mid的值等于target时,说明midIndex就是我们要找的数
if(mid == target){return midIndex;
}
我之所以出错,是因为考虑到最后的target有可能有三种情况:小于nums[leftIndex]、大于nums[leftIndex]小于nums[rightIndex]、大于nums[rightIndex]。需要注意的是,我们比较的是nums[midIndex]和target而不是nums[其他的下标]和target。
然而在我们不断循环的过程中(除去mid == target的情况),leftIndex是会和rightIndex重叠的,也就是leftIndex==rightIndex一定会发生,这种情况下我们再去比较nums[midIndex]和target,要么rightIndex左移,要么leftIndex右移,这样一定会退出循环,最终leftIndex就是我们要找的值。
为什么leftIndex是我们要找的值?
leftIndex==rightIndex发生时,再次循环。
如果rightIndex左移,说明nums[midIndex] > target(注意这个时候midIndex ==leftIndex ==rightIndex),所以target表示的索引位置就是rightIndex+1也就是leftIndex的位置。
如果leftIndex右移,说明nums[midIndex] < target(注意这个时候midIndex ==leftIndex ==rightIndex),所以target表示的索引位置就是rightIndex+1也就是leftIndex的位置。
rightIndex左移和leftIndex右移只是为了退出循环,也可以理解为最终的结果是rightIndex+1,只不过退出循环时leftIndex=rightIndex+1。
代码
class Solution {public int searchInsert(int[] nums, int target) {int leftIndex = 0;int rightIndex = nums.length - 1;while(leftIndex <= rightIndex ){int midIndex = leftIndex + (rightIndex - leftIndex)/2;if(nums[midIndex] == target){return midIndex;}else if(nums[midIndex] > target){rightIndex = midIndex - 1;}else {leftIndex = midIndex + 1;}}return leftIndex;}
}
Nico的刷题日记(二)相关推荐
- Nico的刷题日记(一)
LeetCode278. 第一个错误的版本 在入手了<算法图解>之后,静下心来开始刷题. 第一道题目描述如下: 题目分析: 这道题目是要求从一个最小值为1,依次递增1的有序数组中找到一个b ...
- Nico的刷题日记(三)
977. 有序数组的平方 题目描述 给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 思路分析 以官方的方法二思路为例,双指针. 描述中提到了非递 ...
- Leetcode刷题日记(十二)
又是老台词:欢迎大家来到一晚一度的leetcode刷题日记时间.今天我们来讲讲队列的问题,队列这方面的基础知识需要的同学到博主前面的文章找吧.队列这方面的问题平时博主也是接触得比较少的.下面是一道利用 ...
- 菜菜的刷题日记 | 66.加一 Plus One
系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/7 文章目录 [题目] [我的代码] [参考代码1] [参考代码2] [参考代码3] [思 ...
- 一个算法笨蛋的12月leetCode刷题日记
类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...
- 菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记
系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 万万没想到啊,回老家过年断更的几天之后,我会因为无聊在除夕这天做了会儿题,然后写篇题解. 文章目录 [题目] [我的代码] ...
- 菜菜的刷题日记 | 12.整数转罗马数字
系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/24,这几天忙着肝并发编程,题在做但是没空写题解,今晚补一篇. 文章目录 [题目] [官方 ...
- 牛客刷题日记(2021-12-8)
牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...
- 刷题日记【第十三篇】-笔试必刷题【数根+星际密码+跳台阶扩展问题+快到碗里来】
刷题日记[第十三篇]-笔试必刷题[数根+星际密码+跳台阶扩展问题+快到碗里来] 1.方法区在JVM中也是一个非常重要的区域,它与堆一样,是被[线程共享]的区域. 下面有关JVM内存,说法错误的是?(c ...
最新文章
- python mysql latin1_python操作Mysql数据库
- UI设计师应该知道的,APP设计师的辅助小工具网站集合导航
- 好书推荐!从事数据挖掘、数据分析必看的书!
- 网络安全——社会工程学02
- 医用自动配药柜的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 通过远程PHP远程调用ZABBIX接口获取数据
- win7升级win10系统
- 知乎:有哪些让你相见恨晚的 PPT 制作技术或知识?
- 防雷工程专业术语及雷电浪涌保护器名词解释
- php增加sqlserver扩展
- ubuntu server 7.04(10.04版也行) 挂载移动硬盘
- 不止代码 == 摘读
- 成都盛铭轩:客服应该怎么做
- unity农场游戏Farm Business Version 2
- CTS/RTS/DSR/DTR
- 学习中的典型思维误区总结
- 百度总裁张亚勤宣布10月退休,李彦宏的人才建设要加紧了
- 短信被微信困兽:运营商战或和
- vue el-table下表头和数据都是活动的
- 比较依那西普和柳氮磺胺吡碇治疗早期中轴脊柱关节炎1年后的停药缓解率和缓解时间-ESTHER试验的2年数据...