题目:

给你一个按照非递减顺序排列的整数数组 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. 1 class Solution {
  2. 2 public int[] searchRange(int[] nums, int target) {
  3. 3 if (nums.length == 0) return new int[]{-1, -1};
  4. 4 int left = 0, right = nums.length - 1;
  5. 5 while (left < right){
  6. 6 int mid = left + (right - left) / 2;
  7. 7 if (nums[mid] >= target){
  8. 8 //往左边找
  9. 9 right = mid;
  10. 10 }else{
  11. 11 left = mid + 1;
  12. 12 }
  13. 13 }
  14. 14 if (nums[left] != target) return new int[]{-1, -1};
  15. 15 int L = left;
  16. 16 left = 0;
  17. 17 right = nums.length - 1;
  18. 18 while (left < right){
  19. 19 int mid = left + (right - left + 1) / 2;
  20. 20 if (nums[mid] <= target){
  21. 21 //往右边找
  22. 22 left = mid;
  23. 23 }else {
  24. 24 right = mid -1;
  25. 25 }
  26. 26 }
  27. 27 return new int[]{L, left};
  28. 28 }
  29. 29 }

二分查找的另一种写法:

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

    yarn install --offline npm pack npm install ./package.tgz 尝试了 npm-pack-all --dev-deps 也不行,太慢,等了20分钟 ...

  2. 基于ADS1299的可穿戴设备调试之接口含义简析

    前言    几个项目都用到了ADS1299,没想到中间会出那么多的问题.在解决问题的时候,这里面暴露了团队的不少不足之处.看来做技术,还是需要不断地积累.思维不能留盲点啊.要经常总结,做笔记.   接 ...

  3. SPEAK 510全向麦克风无线蓝牙拾音器产品体验及评测

    产品简介     大家开会的时候,很多人都直接使用手机app了,比如,zoom,腾讯会议等.既方便又快捷.由于手机设备拾音距离有限,也不是针对会议场景做的,所有,在多人会议的时候,问题就出来了.这个时 ...

  4. Android 开发Day8

    /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * gradle pl ...

  5. CloudXR技术如何运用于农业?

    随着科技的不断发展和应用的深入,农业领域也在逐渐引入新技术来优化生产效率和成本.改进管理和监控等.云化XR(CloudXR)作为一种融合了云计算.虚拟现实(VR)和增强现实(AR)等技术的解决方案,也 ...

  6. 在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

    本文首发于公众号:Hunter后端 原文链接:在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手 最近 ChatGPT 式的聊天机器人比较火,可以提供各种问答功能,阿里最 ...

  7. dotnet转换webservice返回的dataset

    string paras = "p1=test1&p2=test2";//参数 byte[] bytes = Encoding.UTF8.GetBytes(paras); ...

  8. KingbaseES V8R6集群运维案例之---主备failover切换原因分析

    案例说明: 生产环境,KingbaseES V8R6的集群发生failover切换,分析集群切换的原因. 适用版本: KingbaseES V8R6 集群架构: 137.xx.xx.67主 原备库 1 ...

  9. Emmet Documentation ( Actions+Filters+Customization )

    Emmet Documentation Actions Expand Abbreviation Balance 选择范围 Go to Matching Pair 匹配对应标签 在sublime tex ...

  10. 运维排查 | Systemd 之服务停止后状态为 failed

    哈喽大家好,我是咸鱼. 我们知道 CentOS 7 之后,Systemd 代替了原来的 SystemV 来管理服务,相比 SystemV ,Systemd 能够很好地解决各个服务间的依赖关系,还能让所 ...