LeetCode HOT 100:在排序数组中查找元素的第一个和最后一个位置
题目:34. 在排序数组中查找元素的第一个和最后一个位置
题目描述:
给你一个递增数组,和一个目标值target,最终返回数组中第一次出现target和最后一次出现target的下标。如果该数组中没有target,返回[-1, -1]。如果只出现了一次target,返回的第一次和最后一次出现的下标相同。
思路:
这一题要求第一次出现target和最后一次出现target的下标。因为数组是递增的,如果能求得小于target的最大值的下标,设为start,那么start + 1下标对应的值就应该是第一次出现target的下标。然后,再用同样的方法,求得小于target + 1的最大值的下标,设为end,这个end下标就是target最后一次出现的下标,最终返回[start + 1, end]。
举个例子:数组[100, 300, 300, 500, 500, 800, 1000],target为500,那么start就应该是小于target的最大值的下标2,小于target + 1的最大值的下标end应该是4,所以最终返回[3, 4]。
步骤:
1、先找到小于target的最大值的下标,设为start,使用二分可以实现
2、判断start + 1下标,如果等于数组长度或者start + 1下标对应的值不为target,说明数组中根本没有出现过target,直接返回[-1, -1]
3、找到小于target + 1的最大值的下标,设为end,同样二分实现
4、返回[start + 1, end]
代码:
public int[] searchRange(int[] nums, int target) {
if (nums == null || nums.length == 0) return new int[]{-1, -1};
// lessMostRight得到小于target的最大值下标,如果nums中有target,该下标的下一个(+1)应该就是target的下标
int start = lessMostRight(nums, target, 0, nums.length - 1) + 1;
// 如果数组越界了,或者下一个下标并不是target,说明数组中没有target元素
if (start == nums.length || nums[start] != target) return new int[]{-1, -1};
// 得到小于 target + 1 的最大值下标,就是target的最右边下标
int end = lessMostRight(nums, target + 1, start, nums.length - 1);
return new int[]{start, end};
}
// 找到nums数组中,小于target的最右边的值的下标(因为数组不递减,也就是得到小于target的最大值下标)
public int lessMostRight(int[] nums, int target, int start, int end) {
int mid = 0;
int ans = -1;
while (start <= end) {
mid = start + ((end - start) >> 1);
if (nums[mid] < target) {
start = mid + 1;
ans = mid;
} else {
end = mid - 1;
}
}
return ans;
}
LeetCode HOT 100:在排序数组中查找元素的第一个和最后一个位置的更多相关文章
- 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...
- Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)
题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...
- 【LeetCode 34】在排序数组中查找元素的第一个和最后一个位置
题目链接 [题解] 二分某个数的上下界. 其实这个方法并不难. 只要你想清楚了二分最后一次执行的位置在什么地方就不难了. [代码] class Solution { public: vector< ...
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- 【LeetCode】34-在排序数组中查找元素的第一个和最后一个位置
题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...
- 【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- #leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log n) 级别.如果数组中不存在目标值,返回 [-1 ...
- C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4970 访问. 给定一个按照升序排列的整数数组 nums,和一个目 ...
随机推荐
- shell脚本中执行source命令不生效的解决办法
一个shell脚本文件中有一个source命令,使用bash a.sh命令执行后source命令进行验证没有生效. 这是因为在shell脚本中执行source会看到效果,但是shell脚本执行完后再次 ...
- SecureCRT登录centos日常操作
ssh登录客户端很多,个人还是习惯使用SecureCRT,非常快捷.简单.针对日常小伙伴经常咨询的常用操作简单记录如下: 建立ssh2连接,比较简单,填写服务器ip及对应的登录用户即可. 登录界面中文 ...
- PHP全栈开发:在本机上创建虚拟主机与域名
如何在windows+wamp环境上进行自己创建的网站的域名访问 step 1 在wamp的安装目录,如C:\wamp64\www\下创建自己的网站目录pe step 2 右键wamp图标,在wamp ...
- ARC148游记
A - mod M 题目链接 这道题我们可以首先对于所有的数 $%2$ ,可以证明出答案最多不超过 $2$ ,此时我们就可以把问题转化为:是否存在一个数使得序列 $a$ 中所有元素减去这个数之后的最大 ...
- Windows常用快捷键及基本的Dos命令
Windows 常用快捷键 Ctrl + C: 复制 Ctrl + V: 粘贴 Ctrl + A: 全选 Ctrl + X: 剪贴 Ctrl + Z: 撤销 Ctrl + S: 保存 Alt + F4 ...
- 计算机网络(Learning Records)
背景:没想到本专业并不开设这门课程,感觉过于逆天,之前开发的时候了解过相关知识 但是从来没有系统地学过,就自己看了书,总结一下 参考:<TCP/IP详解 卷1:协议> 概述 大多数网络应用 ...
- 第一阶段:linux运维基础·2
1. 找到当前目录下所有的.txt文件,且将查询结果写入到allfile.txt中 find . -type f -name '*.txt' > allfile.txt 2. 解读如下语句 -r ...
- clip-path属性深入理解与使用
clip-path CSS 属性可以创建一个只有元素的部分区域可以显示的剪切区域.区域内的部分显示,区域外的隐藏. clip-path的属性值可以是以下几种: 1.inset: 将元素剪裁为一个矩形, ...
- 2022NISACTF--WEB
easyssrf 打开题目,显示的是 尝试输入, 发现输入flag有东西 读取文件 访问下一个网站 读取文件 不能以file开头 直接伪协议,base64解码 checkIn 奇怪的unicode编码 ...
- .Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗
楔子 有小伙伴被面试官问到这个问题,本篇彻底解析下这个问题. 为了彻底点,注意本篇是最底层的.Net 7 RC CLR运行模型(汇编)为基础进行全局剖析,局部业务分析. 如有疏漏,请斧正. 目的非手段 ...