力扣34(java)-在排序数组中查找元素的第一个和最后一个位置(中等)
题目:
给你一个按照非递减顺序排列的整数数组 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)-在排序数组中查找元素的第一个和最后一个位置(中等)的更多相关文章
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- 【LeetCode 34】在排序数组中查找元素的第一个和最后一个位置
题目链接 [题解] 二分某个数的上下界. 其实这个方法并不难. 只要你想清楚了二分最后一次执行的位置在什么地方就不难了. [代码] class Solution { public: vector< ...
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
- 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...
- LeetCode HOT 100:在排序数组中查找元素的第一个和最后一个位置
题目:34. 在排序数组中查找元素的第一个和最后一个位置 题目描述: 给你一个递增数组,和一个目标值target,最终返回数组中第一次出现target和最后一次出现target的下标.如果该数组中没有 ...
- Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)
题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...
- LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- LeetCode--034--在排序数组中查找元素的第一个和最后一个位置(java)
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- 【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- PHP-在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
随机推荐
- yarn install --offline 离线安装 回头试试 npm install ./package.tgz
yarn install --offline npm pack npm install ./package.tgz 尝试了 npm-pack-all --dev-deps 也不行,太慢,等了20分钟 ...
- 基于ADS1299的可穿戴设备调试之接口含义简析
前言 几个项目都用到了ADS1299,没想到中间会出那么多的问题.在解决问题的时候,这里面暴露了团队的不少不足之处.看来做技术,还是需要不断地积累.思维不能留盲点啊.要经常总结,做笔记. 接 ...
- SPEAK 510全向麦克风无线蓝牙拾音器产品体验及评测
产品简介 大家开会的时候,很多人都直接使用手机app了,比如,zoom,腾讯会议等.既方便又快捷.由于手机设备拾音距离有限,也不是针对会议场景做的,所有,在多人会议的时候,问题就出来了.这个时 ...
- Android 开发Day8
/* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * gradle pl ...
- CloudXR技术如何运用于农业?
随着科技的不断发展和应用的深入,农业领域也在逐渐引入新技术来优化生产效率和成本.改进管理和监控等.云化XR(CloudXR)作为一种融合了云计算.虚拟现实(VR)和增强现实(AR)等技术的解决方案,也 ...
- 在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手
本文首发于公众号:Hunter后端 原文链接:在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手 最近 ChatGPT 式的聊天机器人比较火,可以提供各种问答功能,阿里最 ...
- dotnet转换webservice返回的dataset
string paras = "p1=test1&p2=test2";//参数 byte[] bytes = Encoding.UTF8.GetBytes(paras); ...
- KingbaseES V8R6集群运维案例之---主备failover切换原因分析
案例说明: 生产环境,KingbaseES V8R6的集群发生failover切换,分析集群切换的原因. 适用版本: KingbaseES V8R6 集群架构: 137.xx.xx.67主 原备库 1 ...
- Emmet Documentation ( Actions+Filters+Customization )
Emmet Documentation Actions Expand Abbreviation Balance 选择范围 Go to Matching Pair 匹配对应标签 在sublime tex ...
- 运维排查 | Systemd 之服务停止后状态为 failed
哈喽大家好,我是咸鱼. 我们知道 CentOS 7 之后,Systemd 代替了原来的 SystemV 来管理服务,相比 SystemV ,Systemd 能够很好地解决各个服务间的依赖关系,还能让所 ...