力扣35(java&python)-搜索插入位置(简单)
题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 为 无重复元素 的 升序 排列数组
- -104 <= target <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
【二分查找】
题目中意思是:如果目标值存在数组中,找到并返回它的索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
那么目标值一定满足:nums[i-1] < target <= nums[i],如果存在目标值,返回的索引为 i ,不存在也返回应该是 i ,因此可以理解为:【在一个有序数组中找到第一个大于等于target的下标】,整体思路为:
- 设定左侧下标left = 0,右侧下标为 right = nums.length - 1;
- 计算中间下标 mid = left + (right - left) / 2(相当于mid = (left + right) /2 或 mid = (left + right) >> 1);
- 根据nums[mid] 和 target所对应的数字大小决定操作,如果相等,直接返回mid,如果target > nums[mid],则mid = left + 1,如果target < nums[mid],则mid = right - 1;
- 查找结束的条件是:left > right,查找结束还没有找到,则直接返回left。
部分操作解释:
1.mid = left + (right - left) / 2,
解:mid = left + (right - left) / 2 = left + 1/2right - 1/2left = 1/2left + 1/2right,这样做是为了防止整型溢出,举个例子,假如现在数值最多到 10,大于10就会溢出了,现在假设left = 6 right = 8;如果现在两个相加再除,6+8 = 14发生溢出了。但是是6 + (8-6)/2 则是6+1 = 7 则不会溢出。我看也有写成:long mid = left + (right - left)/2。
mid = (left + right) >> 1:是将left+right的结果右移一位,位运算右移一位相当于除以2,举个例子:1110(14),右移一位为0111(7)【右移是除,左移是乘】
2.为什么没找到target时返回left?
解:这里只讨论找不到目标值的情况,每次while循环都会使得[left, right]中的元素减少,left左边的元素都是小于target的,right右边的元素都是大于target的,最后一次while循环执行时left=right,执行完毕,left指向的就是第一个大于target的位置,right指向的就是最后一个小于target的位置,例如[3,5],target = 1,首先进入循环取mid=(0+1)/2=0,0位置上的数是3大于target,执行right-1=0,此时right=left=0,再执行最后一次循环, mid = 0, 0位置上的数是3大于target, right- 1 -0, 此时 left > right, 退出循环,退出后left=0,right=-1,故返回left。
java代码:while(left <= right)
1 class Solution {
2 public int searchInsert(int[] nums, int target) {
3 int left = 0, right = nums.length - 1;
4 while(left <= right){
5 int mid = left + (right - left) / 2;
6 if(target > nums[mid]){
7 left = mid + 1;
8 }else if (target < nums[mid]){
9 right = mid - 1;
10 }else{
11 return mid;
12 }
13 }
14 return left;
15 }
16 }
java代码:while(left <right)
1 class Solution {
2 public int searchInsert(int[] nums, int target) {
3 //特殊判断len的位置也有可能是答案
4 if (nums[nums.length - 1] < target) return nums.length;
5 //下面的都满足nums[nums.length - 1] > target
6 int left = 0, right = nums.length - 1;
7 while (left < right){
8 int mid = left + (right - left) / 2;
9 if (nums[mid] >= target){
10 //下一轮搜索区间:[left,mid]
11 right = mid;
12 }else{
13 left = mid + 1;
14 }
15 }
16 //循环结束时:left = right,一定会找到答案返回left
17 return left;
18 }
19 }
python代码:
1 class Solution:
2 def searchInsert(self, nums: List[int], target: int) -> int:
3 left, right = 0, len(nums) - 1
4 while left <= right:
5 mid = left + ((right - left) // 2)
6 if target > nums[mid]:
7 left = mid + 1
8 elif target < nums[mid]:
9 right = mid - 1
10 else:
11 return mid
12 return left
力扣35(java&python)-搜索插入位置(简单)的更多相关文章
- 刷题-力扣-230. 二叉搜索树中第K小的元素
230. 二叉搜索树中第K小的元素 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a ...
- LeetCode第35题:搜索插入位置
题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6 ...
- LeetCode(35):搜索插入位置
Easy! 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1 ...
- Java实现 LeetCode 35 搜索插入位置
35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1, ...
- Leetcode 35.搜索插入位置 By Python
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...
- LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组 中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
- [leetcode] 35. 搜索插入位置(Java)(二分)
35. 搜索插入位置 二分,太简单,没啥好说的 class Solution { public int searchInsert(int[] nums, int target) { if (nums. ...
- leetcode笔记——35.搜索插入位置 - CrowFea
0.问题描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 12 输入: [1,3 ...
- Leetcode之二分法专题-35. 搜索插入位置(Search Insert Position)
Leetcode之二分法专题-35. 搜索插入位置(Search Insert Position) 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会 ...
随机推荐
- QSAN: A Quantum-probability based Signed Attention Network for Explainable False Information Detection-CIKM20
一.摘要 在社交媒体上的虚假信息检测具有挑战性,因为它通常需要烦冗的证据收集,但又缺乏可用的比较信息.从用户评论中挖掘出的线索作为群体智慧,可能对这项任务有相当大的好处. 然而,考虑到内容和评论的隐式 ...
- linux下命令行打开文件夹窗口
方法一: 使用自带的命令:nautilus . 打开当前文件夹 nautilus . 打开指定路径文件夹 nautilus ddd/ccc/ 方法二:xdg-open xdg-open 命令相当于在 ...
- RunOnWeb - 创建新协议,支持html调用本地可执行文件,支持浏览器互相调用
浏览器调用 exe ? Yes! 谷歌 Chrome 启动微软 Edge ? Yes! RunOnWeb 协议 创建新协议,支持html调用本地可执行文件,支持浏览器互相调用 [最新版 ...
- RV1126编译过程
一.编译环境 1.目标系统:ubuntu 22.04 LTS 2.投屏器SDK下载: 链接:https://pan.baidu.com/s/1OJQafxm38FnbshMEu432Og 提取码:o6 ...
- 初识uds之abstract socket
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 在<记一次有趣的hwclock ...
- 一个.net6开发的截图后ocr小工具
软件使用 .net6 winfrom 开发 ocr使用的是paddleOCR .net下调用paddleOCR 用 sdcb.PaddleOCR https://github.com/sdcb/Pad ...
- 实时渲染大赛结果将于3月31日晚8点B站直播公布,敬请期待!
根据评选标准,经过评委组层层选拔,首届实时渲染3D动画创作大赛,最终获奖结果出炉啦! 本次赛事报名人数达212人,入围作品共40份,其中Omniverse组11份,专业组15份,学生组14份. 我们将 ...
- Newtonsoft.Json/Json.NET忽略序列化时的意外错误
在.NET中Newtonsoft.Json(Json.NET)是我们常用来进行Json序列化与反序列化的库. 而在使用中常会遇到反序列化Json时,遇到不规则的Json数据解构而抛出异常. Newto ...
- 记录-Vue移动端日历设计与实现
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 工作中遇到一个需求是根据日历查看某一天/某一周/某一月的睡眠报告,但是找了好多日历组件都不是很符合需求,只好自己手写一个日历组件,顺便记录 ...
- 解决cv2. imread、imwrite无法读取或保存中文路径图片问题
cv2.imwrite(filename, img) 修改为 cv2.imencode('.jpg', img)[1].tofile(filename) cv2.imread(filename, cv ...