【手把手带你刷LeetCode】——05.搜索插入位置

举报
安然无虞 发表于 2022/05/27 00:58:12 2022/05/27
【摘要】 目录 原题:搜索插入位置 题目描述  解题思路  代码执行 复杂度分析 结语  【前言】:HelloHello大家好,又见面喽,今天是力扣打卡第5天!还有没有小伙伴没有上车呢,记得每天坚持刷题哦。 原题:搜索插入位置 题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,...

目录

原题:搜索插入位置

题目描述

 解题思路

 代码执行

复杂度分析

结语 


【前言】:HelloHello大家好,又见面喽,今天是力扣打卡第5天!还有没有小伙伴没有上车呢,记得每天坚持刷题哦。

原题:搜索插入位置

题目描述

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

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

【敲黑板】:遇到这种搜索题时间复杂度要求是O(logN)的,记得采用二分法

示例1:


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

 示例2:


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

 解题思路

对于这题,由于是在已经排好序的数组中查找元素,而且要求时间复杂度是O(logN),所以我们很容易就想起来利用二分法解题。

 代码执行


  
  1. int searchInsert(int* nums, int numsSize, int target){
  2. if(nums == NULL || numsSize == 0){
  3. return -1;
  4. }
  5. int left = 0;
  6. int right = numsSize - 1;
  7. int mid = 0;
  8. //注意为什么不是left <= right ,因为当left == right时就不知道要插哪里去了
  9. while(left < right){
  10. mid = left + (right - left) / 2;
  11. if(nums[mid] > target){
  12. //因为插入的数要么在left和right之间,要么在两者之上
  13. //如果是right = mid - 1, 可能会比要查找的数小,那么插入的位置在right之后,这样就容易混乱
  14. right = mid;
  15. }else if(nums[mid] < target){
  16. //left还是left = mid + 1,因为如果此时left大于目标值下标,也是第一个大于它的数
  17. left = mid + 1;
  18. }else{
  19. return mid;
  20. }
  21. }
  22. //没有找到目标值
  23. //插入的位置,从left下标考虑,所以上面的right才写成right = mid,不然还需要多考虑right的情况
  24. //nums[left] == target表示只有一个元素的特殊情况
  25. if(nums[left] >= target){
  26. return left;
  27. }else{
  28. return left + 1;
  29. }
  30. }

【敲黑板】:之所以写成mid = left + (right - left) / 2, 而不是mid = (left + right) / 2, 是因为left + right做的是加法运算可能会超出int范围。 

复杂度分析

时间复杂度:O(logN)

空间复杂度:O(1)

结语 

今天是力扣打卡第5天!

笔者会一直坚持下去的,和铁汁们一起加油,互相监督哦。

加油加油,咱们明天再见!!

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121128815

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。