题目: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]target500,那么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:在排序数组中查找元素的第一个和最后一个位置的更多相关文章

  1. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  2. Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)

    题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

  3. 【LeetCode 34】在排序数组中查找元素的第一个和最后一个位置

    题目链接 [题解] 二分某个数的上下界. 其实这个方法并不难. 只要你想清楚了二分最后一次执行的位置在什么地方就不难了. [代码] class Solution { public: vector< ...

  4. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  5. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  6. 【LeetCode】34-在排序数组中查找元素的第一个和最后一个位置

    题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...

  7. 【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  8. LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  9. #leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log n) 级别.如果数组中不存在目标值,返回 [-1 ...

  10. C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4970 访问. 给定一个按照升序排列的整数数组 nums,和一个目 ...

随机推荐

  1. [笔记] 一种快速求 1 ~ n 逆元的方法

    我们现在要求1~n在mod m意义下的逆元(n<m,m为素数). 对于一个[1,n]中的数i,我们令\(k=\lfloor\frac{m}{i}\rfloor,r=m \ mod \ i\) 然 ...

  2. C#-5 类和继承

    一 类继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.继承呈现了面向对象程序设计的层次结构. 通过继承,我们能以一个已经存在的类为基础来定义一个新类.已存在的类称为基类或父类 ...

  3. 文件内再分类到各txt文件

    当老师叫我们帮他做事,比如文件内内容再分类,我们就可以建个面板,里面有各要导入文件按钮,先把分类内容copy下,再点按钮导入进txt文件就行啦. 以下为java代码,使用了tableLayout布局 ...

  4. JuiceFS 元数据引擎选型指南

    文件系统是我们常见的存储形式,内部主要由数据和元数据两部分组成.其中数据是文件的具体内容,通常会直接展现给用户:而元数据是描述数据的数据,用来记录文件属性.目录结构.数据存储位置等.一般来说,元数据有 ...

  5. 删除数组里含有a的元素,并且将null值放在后面

    想去掉里面含有a的元素,并将null放在后面.放在后面就是往后移,其他值往左移 1 public static void main(String[] args) { 2 //自定义的一个数组 3 St ...

  6. Windows Server 2012部署遇到的问题

    一.安装IIS提示"服务器管理器WinRM插件可能已损坏或丢失" 解决方案: 1.开启WinRM服务,添加ip监听 在服务中查看WinRM服务是否开启,如果没有开启则把该服务开启, ...

  7. 齐博x1头部底部菜单高亮设置

    下面这段是默认模板头部的导航菜单: {php}$menu_choose=config('system_dirname')?config('system_dirname'):'index';{/php} ...

  8. 如何实现一个SQL解析器

    ​作者:vivo 互联网搜索团队- Deng Jie 一.背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进 ...

  9. Scrapy 发送Request Payload

    Scrapy 发送Request Payload 首先要打开 F12 进入调试模式 然后 查看是用什么方法获取的 如果是Json: 1. json.dumps 转化成Json yield Reques ...

  10. Java线程未捕获异常处理 UncaughtExceptionHandler

    当一个线程在执行过程中抛出了异常,并且没有进行try..catch,那么这个线程就会终止运行.在Thread类中,提供了两个可以设置线程未捕获异常的全局处理器,我们可以在处理器里做一些工作,例如将异常 ...