LeetCode 第35题 搜索插入位置 做题记录
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)有序数组:二分查找的基础条件
(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题 搜索插入位置 做题记录相关推荐
- Misc做题总结(做题一时爽)
文章目录 №.1 隐写 Stegsolve一般怎么用呢? Winhex又怎么用呢? 最后还有一个Binwalk~ №.2 流量分析 来看几道题目: №.3 NTFS交换数据流隐写 日常做题: 偶尔做题 ...
- LeetCode每日一题: 搜索插入位置(No.35)
题目:搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 复制代码 示例: 输入: [ ...
- 【软考三】软设下午题第一大题--数据流图(做题)
软设下午第一大题 一.数据流图(Data Flow Diagram,简称DFD) 1.基本图形元素元素 (1)外部实体(External Agent) (2)数据存储(Data Store) (3)数 ...
- Leetcode每日一题:35.search-insert-position(搜索插入位置)
思路:有序查找首先想到二分:这里的话,再加一个判断:如果最后得到的下标对应的值小于target的话,说明target应该插入到这个下标的右边:否则,应该插入到该下标位置: class Solution ...
- leetcode第三十五题 搜索插入位置(Java)——二分查找
题目如下: 给出的输出示例如下: 根据题意必须要使用时间复杂度为O(log n)的算法.而普通常用的暴力求解时间复杂度为 O(n),所以这里为了解决这道题使用二分查找的方法,而二分查找的时间复杂度恰好 ...
- 【leetcode 简单】第十一题 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...
- java算法题:搜索插入位置
原题:给定一个排序数组和一个目标值,在数组中找到目标值.并返回其索引,如果目标值不存在数组中,放回它将被按顺序插入位置的索引(使用时间复杂度(logN)的算法): 所以捏,我们使用二分查找法解决问题 ...
- leetcode 953. 验证外星语词典 做题笔记
题目: 某种外星语也使用英文小写字母,但可能顺序 order 不同.字母表的顺序(order)是一些小写字母的排列. 给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定 ...
- LeetCode 860. 柠檬水找零 做题小结
题目 在柠檬水摊上,每一杯柠檬水的售价为 5 美元.顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯.每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须 ...
- 考研数据结构填空题整合_做题版
考研数据结构填空题整合 目录 考研数据结构填空题整合 一.ZYL组 ZYL组一 ZYL组二 ZYL组三 ZYL组四 ZYL组五 ZYL组六 ZYL组七 ZYL组八 二.TJP组 TJP组一 TJP组二 ...
最新文章
- 利用epoll写一个迷你的网络事件库
- 火星上的甲烷从哪里来,科学家用算法给出了答案
- win 7 DHCP获取不到ip的解决办法
- android handler,Android中Handler原理
- ASP.NET MVC网站学习问题积累(一)
- layer ajax 用法,layer加载遮罩层使用 Ajax Loading Demo
- C++设计模式-迭代器模式
- localStorage本地存储数组、读取、修改、删除
- 05NumPy--5.1多维数组
- Arduino十大滤波算法程序大全(精编无错版)
- 【NLP】Dive into BERT:语言模型与知识
- OFFICE拼写语法检查:WORD是怎么做的?
- python操作微信电脑版_【Python】【微信】+操作电脑版微信
- 教育培训机构如何利用小程序招生?
- axios delete
- [渝粤教育] 四川轻化工大学 化工设备机械基础 参考 资料
- 我推崇的流行唱法:美國Speech Level Singing的介紹和討論(推荐)
- SQL SERVER 读取数据库中所有表名
- 在前程无忧实习是怎样一个体验
- 【转】翻译中的黄金词组