LeetCode 第35题 搜索插入位置 做题记录

  • 题目描述
  • 我的解法
    • 思路
    • 对应Java代码
    • 复杂度分析
  • 更优的解法
    • 思路
    • 对应Java代码
    • 复杂度分析
  • 收获总结

题目描述

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

示例 1:
输入: [1,3,5,6], 5
输出: 2

示例 2:
输入: [1,3,5,6], 2
输出: 1

示例 3:
输入: [1,3,5,6], 7
输出: 4

示例 4:
输入: [1,3,5,6], 0
输出: 0

我的解法

思路

暴力搜索,从数组第一个值开始与目标值进行比较,如果目标值小于等于当前值则返回当前索引,否则比较下一个值;若数组遍历结束后仍未找到符合条件的值,则返回当前索引值+1

对应Java代码

class Solution {public int searchInsert(int[] nums, int target) {int i = 0;for (; i < nums.length; i++) {if (target <= nums[i]){return i;}}return i;}
}

复杂度分析

时间复杂度:O(N) 这里的N对应的是数组长度
空间复杂度:O(1) 用到常数个临时变量

更优的解法

思路

学习于公众号代码随想录,大佬讲的很清楚

二分法

  1. 适用场景
    (1)有序数组:二分查找的基础条件
    (2)无重复元素:一旦有重复元素,使用二分查找法返回的元素下表可能不是唯一的

  2. 难点——边界条件
    二分法的算法逻辑很容易理解,实际应用时的问题在于边界条件处理不好,例如到底是while (left < right)还是while (left <= right) ,是right = middle 呢,还是要right = middle - 1 呢?

    这里弄不清楚主要是因为「对区间的定义没有想清楚,这就是不变量」。要在二 分查找的过程中,保持不变量,这也就是「循环不变量」 (感兴趣的同学可以查一查)。
    【个人理解】循环不变量是指判断条件的定义不变,即下面自己定义的左闭右闭,左闭右不闭不变,根据这一点就可以选择循环中涉及到的各种边界值了。

对应Java代码

以这道题目来举例,以下的代码中定义 target 是在一个在左闭右闭的区间里,「也就是[left, right] (这个很重要)」。这就决定了这个二分法的代码如何去写,大家看如下代码:「大家要仔细看注释,思考为什么要写while(left <= right), 为什么要写right = middle - 1」。

class Solution {public int searchInsert(int[] nums, int target) {int n = nums.length;int left = 0;int right = n - 1; // 定义target在左闭右闭的区间里, [left, rigth]while (left <= right) { // 当left==right, 区间[left,right]依然有效int middle = left + ((right - left) / 2); // 防止溢出 等同于(left + right)/2if (nums[middle] > target) {right = middle - 1; // target 在左区间,所以[left, middle - 1]} else if (nums[middle] < target) {left = middle + 1; // target 在右区间,所以[middle + 1, right]} else {return middle;}}// 分别处理如下四种情况// 目标值在数组所有元素之前  [0, -1]// 目标值等于数组中某一个元素  return middle;// 目标值插入数组中的位置 [left, right],return  right + 1// 目标值在数组所有元素之后的情况 [left, right], return right + 1return right + 1;}
}

复杂度分析

时间复杂度:O(logN)
空间复杂度:O(1)

收获总结

在数组搜索方面学习到了除暴力搜索外的另一种方法——二分法
并且了解了二分法适用的场景,掌握了实际应用时主要该注意的边界值处理方法,即认为设定一个边界原则(如左闭右闭),然后在另循环中的所有边界值都符合该规则,至于返回值(right+1),不确定的情况可以举个简单的例子看一下

以上的方法并不是什么定律,但是可以解决此类问题,可以理解成某一种类型题的解法。

LeetCode 第35题 搜索插入位置 做题记录相关推荐

  1. Misc做题总结(做题一时爽)

    文章目录 №.1 隐写 Stegsolve一般怎么用呢? Winhex又怎么用呢? 最后还有一个Binwalk~ №.2 流量分析 来看几道题目: №.3 NTFS交换数据流隐写 日常做题: 偶尔做题 ...

  2. LeetCode每日一题: 搜索插入位置(No.35)

    题目:搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 复制代码 示例: 输入: [ ...

  3. 【软考三】软设下午题第一大题--数据流图(做题)

    软设下午第一大题 一.数据流图(Data Flow Diagram,简称DFD) 1.基本图形元素元素 (1)外部实体(External Agent) (2)数据存储(Data Store) (3)数 ...

  4. Leetcode每日一题:35.search-insert-position(搜索插入位置)

    思路:有序查找首先想到二分:这里的话,再加一个判断:如果最后得到的下标对应的值小于target的话,说明target应该插入到这个下标的右边:否则,应该插入到该下标位置: class Solution ...

  5. leetcode第三十五题 搜索插入位置(Java)——二分查找

    题目如下: 给出的输出示例如下: 根据题意必须要使用时间复杂度为O(log n)的算法.而普通常用的暴力求解时间复杂度为 O(n),所以这里为了解决这道题使用二分查找的方法,而二分查找的时间复杂度恰好 ...

  6. 【leetcode 简单】第十一题 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...

  7. java算法题:搜索插入位置

    原题:给定一个排序数组和一个目标值,在数组中找到目标值.并返回其索引,如果目标值不存在数组中,放回它将被按顺序插入位置的索引(使用时间复杂度(logN)的算法): 所以捏,我们使用二分查找法解决问题 ...

  8. leetcode 953. 验证外星语词典 做题笔记

    题目: 某种外星语也使用英文小写字母,但可能顺序 order 不同.字母表的顺序(order)是一些小写字母的排列. 给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定 ...

  9. LeetCode 860. 柠檬水找零 做题小结

    题目 在柠檬水摊上,每一杯柠檬水的售价为 5 美元.顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯.每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须 ...

  10. 考研数据结构填空题整合_做题版

    考研数据结构填空题整合 目录 考研数据结构填空题整合 一.ZYL组 ZYL组一 ZYL组二 ZYL组三 ZYL组四 ZYL组五 ZYL组六 ZYL组七 ZYL组八 二.TJP组 TJP组一 TJP组二 ...

最新文章

  1. 利用epoll写一个迷你的网络事件库
  2. 火星上的甲烷从哪里来,科学家用算法给出了答案
  3. win 7 DHCP获取不到ip的解决办法
  4. android handler,Android中Handler原理
  5. ASP.NET MVC网站学习问题积累(一)
  6. layer ajax 用法,layer加载遮罩层使用 Ajax Loading Demo
  7. C++设计模式-迭代器模式
  8. localStorage本地存储数组、读取、修改、删除
  9. 05NumPy--5.1多维数组
  10. Arduino十大滤波算法程序大全(精编无错版)
  11. 【NLP】Dive into BERT:语言模型与知识
  12. OFFICE拼写语法检查:WORD是怎么做的?
  13. python操作微信电脑版_【Python】【微信】+操作电脑版微信
  14. 教育培训机构如何利用小程序招生?
  15. axios delete
  16. [渝粤教育] 四川轻化工大学 化工设备机械基础 参考 资料
  17. 我推崇的流行唱法:美國Speech Level Singing的介紹和討論(推荐)
  18. SQL SERVER 读取数据库中所有表名
  19. 在前程无忧实习是怎样一个体验
  20. 【转】翻译中的黄金词组

热门文章

  1. 2021年IEEE Fellow刚刚放榜!84位华人学者当选再创新高!
  2. 163邮箱登陆写信自动化脚本
  3. jieba分词关键词抽取
  4. NXCOMPAT选项和数据执行保护DEP
  5. vue3使用datav
  6. 无法装载DLL Microsoft原因: 126(找不到指定的模块)
  7. SpringCloud版本Hoxton SR5 --- 第二讲:eureka 、eureka与zookeeper的区别与使用场景。
  8. 购买计算机设备计入什么科目,企业购买设备计入什么会计科目?附会计分录
  9. Python 批处理文件(全)
  10. YOCTO开机画面修改