题目:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找】

需要查找起始位置和结束位置

1.查找起始位置:运用二分查找,left = 0, right = nums.length() - 1,需要找到大于等于target的最左边界

  • 当nums[mid] >= target时,往左边区域找,此时 rigth = mid;
  • 当nums[mid] < target,往右边区域找,此时left = mid + 1;
  • 循环结束的条件是:left >= right,此时的nums[left] != target,说明没找打,就直接返回[-1, -1],否则就找到了起始位置L。

2.查找结束位置:运用二分查找,left = 0, right = nums.length()-1,需要找到小于等于target的最右边界

  • 当nums[mid] > target时,往左边区域找,此时 rigth = mid - 1;
  • 当nums[mid] <= target,往右边区域找,此时left = mid ;
  • 循环结束,找到了最后一个小于等于target的位置即结束位置R,返回[L, R]。

java代码:

 1 class Solution {
2 public int[] searchRange(int[] nums, int target) {
3 if (nums.length == 0) return new int[]{-1, -1};
4 int left = 0, right = nums.length - 1;
5 while (left < right){
6 int mid = left + (right - left) / 2;
7 if (nums[mid] >= target){
8 //往左边找
9 right = mid;
10 }else{
11 left = mid + 1;
12 }
13 }
14 if (nums[left] != target) return new int[]{-1, -1};
15 int L = left;
16 left = 0;
17 right = nums.length - 1;
18 while (left < right){
19 int mid = left + (right - left + 1) / 2;
20 if (nums[mid] <= target){
21 //往右边找
22 left = mid;
23 }else {
24 right = mid -1;
25 }
26 }
27 return new int[]{L, left};
28 }
29 }

二分查找的另一种写法:

 1 class Solution {
2 public int[] searchRange(int[] nums, int target) {
3 if (nums.length == 0) return new int[]{-1,-1};
4 int Firstindex = FirstTargetIndex(nums, target);
5 if (Firstindex == -1) return new int[]{-1,-1};
6 int Lastindex = LastTargetIndex(nums, target);
7 return new int[]{Firstindex, Lastindex};
8 }
9 //找第一个目标位置
10 public int FirstTargetIndex(int[] nums, int target){
11 int left = 0, right = nums.length - 1;
12 while (left < right){
13 int mid = left + (right - left) / 2;
14 //注意这里的条件区间,在右边,取的是离中间值最近的边界值为第一个目标值
15 if (nums[mid] >= target){
16 //搜索区间为[left,mid]
17 right = mid;
18 }else{
19 //搜索区间为[mid+1, right]
20 left = mid + 1;
21 }
22 }
23 if (nums[left] == target) return left;
24 return -1;
25 }
26 //找第一个目标位置
27 public int LastTargetIndex(int[] nums, int target){
28 int left = 0, right = nums.length - 1;
29 while (left < right){
30 int mid = left + (right - left + 1) / 2;
31 //注意这里的条件区间,在左边,取的是离中间值最近的边界值为最后一个目标值
32 if (nums[mid] <= target){
33 //搜索区间为[mid, right],注意这时mid应该改为向上取整
34 left = mid;
35 }else{
36 //搜索区间为[left, right - 1]
37 right = mid - 1;
38 }
39 }
40 return left;
41 }
42 }

与 剑指offer53(Java)-在排序数组中查找数字(简单)差不多,只是返回的形式不一样。

力扣34(java)-在排序数组中查找元素的第一个和最后一个位置(中等)的更多相关文章

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

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

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

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

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

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

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

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

  5. LeetCode HOT 100:在排序数组中查找元素的第一个和最后一个位置

    题目:34. 在排序数组中查找元素的第一个和最后一个位置 题目描述: 给你一个递增数组,和一个目标值target,最终返回数组中第一次出现target和最后一次出现target的下标.如果该数组中没有 ...

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

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

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

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

  8. LeetCode--034--在排序数组中查找元素的第一个和最后一个位置(java)

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

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

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

  10. PHP-在排序数组中查找元素的第一个和最后一个位置

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

随机推荐

  1. Springboot K8s Job 一次性任务 如何禁用端口监听

    问题:SpringBoot一次性任务执行时,也会默认监听服务端口,当使用k8s job运行时,可能多个pod执行存在端口冲突 解决办法:命令行禁用SpringBoot一次性任务启动时端口占用 java ...

  2. ubuntu spyder3 颜色重置为暗色

    天杀的微软,爷用的是正版的专业版windows10还给爷推送个拿屁股作出来的系统 20H2 ,所有被强制更新的用户都不同程度的黑屏.卡顿.重启.还是ubuntu大法啊! 在ubuntu上换源下载vlc ...

  3. 【算法】C和Python实现快速排序-三数中值划分选择主元(非随机)

    一.快排基础 1.1 快排的流程 将数组A进行快速排序的基本步骤-quick_sort(A): 递归基础情况:如果A中的元素个数是1或0,则返回. 选取主元:取A中的任意一个元素v,作为主元(pivo ...

  4. 为aws中国配置docker镜像加速

    在AWS中国,docker镜像基本无法拉取,更换国内镜像是必须的. 修改docker配置文件 sudo vi /etc/sysconfig/docker 找到OPTIONS参数,在后面加上" ...

  5. 快速搭建Web安全测试环境

    快速搭建Web安全测试环境 1.虚拟机安装 2.网站搭建 一.虚拟机安装 下载VMware虚拟机,Windows 虚拟机 | Workstation Pro | VMware | CN 安装VMwar ...

  6. 投屏项目中Sink端CPU占用过高问题

    一.背景 今天来总结一下,自己在项目中遇到的一个CPU占用过高的问题,详细的结束从发现到定位在到解决问题的过程. 原因是性能测试那边提出了一个bug,就是在投屏过程中,平板端也就是Sink端功耗非常高 ...

  7. gRPC入门学习之旅(二)

    gRPC入门学习之旅(一) gRPC是一个高性能.通用的开源远程过程调用(RPC)框架,基于底层HTTP/2协议标准和协议层Protobuf序列化协议开发,支持众多的开发语言,由Google开源. g ...

  8. 崩溃bug日志总结2

    目录介绍 1.1 java.lang.ClassNotFoundException类找不到异常 1.2 java.util.concurrent.TimeoutException连接超时崩溃 1.3 ...

  9. top 命令解释

    PID:进程ID USER:运行改进程的用户 PR:进程的优先级 NI:Nice值,进程的优先级修正值,负值表示高优先级,正值表示低优先级 VIRT:虚拟内存,进程使用的虚拟内存总量 RES:物理内存 ...

  10. Windows10系统重装教程

    .