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的刷题日记(二)相关推荐

  1. Nico的刷题日记(一)

    LeetCode278. 第一个错误的版本 在入手了<算法图解>之后,静下心来开始刷题. 第一道题目描述如下: 题目分析: 这道题目是要求从一个最小值为1,依次递增1的有序数组中找到一个b ...

  2. Nico的刷题日记(三)

    977. 有序数组的平方 题目描述 给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 思路分析 以官方的方法二思路为例,双指针. 描述中提到了非递 ...

  3. Leetcode刷题日记(十二)

    又是老台词:欢迎大家来到一晚一度的leetcode刷题日记时间.今天我们来讲讲队列的问题,队列这方面的基础知识需要的同学到博主前面的文章找吧.队列这方面的问题平时博主也是接触得比较少的.下面是一道利用 ...

  4. 菜菜的刷题日记 | 66.加一 Plus One

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/7 文章目录 [题目] [我的代码] [参考代码1] [参考代码2] [参考代码3] [思 ...

  5. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  6. 菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 万万没想到啊,回老家过年断更的几天之后,我会因为无聊在除夕这天做了会儿题,然后写篇题解. 文章目录 [题目] [我的代码] ...

  7. 菜菜的刷题日记 | 12.整数转罗马数字

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/24,这几天忙着肝并发编程,题在做但是没空写题解,今晚补一篇. 文章目录 [题目] [官方 ...

  8. 牛客刷题日记(2021-12-8)

    牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...

  9. 刷题日记【第十三篇】-笔试必刷题【数根+星际密码+跳台阶扩展问题+快到碗里来】

    刷题日记[第十三篇]-笔试必刷题[数根+星际密码+跳台阶扩展问题+快到碗里来] 1.方法区在JVM中也是一个非常重要的区域,它与堆一样,是被[线程共享]的区域. 下面有关JVM内存,说法错误的是?(c ...

最新文章

  1. python mysql latin1_python操作Mysql数据库
  2. UI设计师应该知道的,APP设计师的辅助小工具网站集合导航
  3. 好书推荐!从事数据挖掘、数据分析必看的书!
  4. 网络安全——社会工程学02
  5. 医用自动配药柜的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  6. 通过远程PHP远程调用ZABBIX接口获取数据
  7. win7升级win10系统
  8. 知乎:有哪些让你相见恨晚的 PPT 制作技术或知识?
  9. 防雷工程专业术语及雷电浪涌保护器名词解释
  10. php增加sqlserver扩展
  11. ubuntu server 7.04(10.04版也行) 挂载移动硬盘
  12. 不止代码 == 摘读
  13. 成都盛铭轩:客服应该怎么做
  14. unity农场游戏Farm Business Version 2
  15. CTS/RTS/DSR/DTR
  16. 学习中的典型思维误区总结
  17. 百度总裁张亚勤宣布10月退休,李彦宏的人才建设要加紧了
  18. 短信被微信困兽:运营商战或和
  19. vue el-table下表头和数据都是活动的
  20. 比较依那西普和柳氮磺胺吡碇治疗早期中轴脊柱关节炎1年后的停药缓解率和缓解时间-ESTHER试验的2年数据...

热门文章

  1. HTTP请求出现405 not allowed的一种解决办法经验分享
  2. 2021年全国城镇单位就业人员平均工资数据出炉
  3. MOS驱动电机正反转
  4. 【HTMLayout学习】学习缘由、什么是HTMLayout?
  5. RF MEMS开关时代将开启-30?
  6. 智能存储 | 视频 DNA ,独一无二的安全标识
  7. 3D动态烟花--HTML
  8. 定语从句和同位语重句的区别
  9. mysql的主从复制和半同步复制的配置
  10. Xilinx UltraScale