力扣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分钟 ...
- FAT32 文件系统详解
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- vim的使用进步
vim的使用进步 1.如果遇到命令行中无法退出的 狂按esc按键 或者也可以使用v模式下切换一下,之后按esc 保存退出 保存退出--:wq 保存:w 不保存退出:q! i--插入模式 v- 可视化模 ...
- 喜报|3DCAT成为国内首批适配Vision Pro内容开发者
近日,苹果在上海总部举办了国内首场 Apple Vision Pro 开发者实验室活动,3DCAT作为国内领先的实时渲染云平台参与了此次活动,成为国内首批适配 Vision Pro 的内容开发者之一. ...
- Bitmap优化详谈
目录介绍 01.如何计算Bitmap占用内存 1.1 如何计算占用内存 1.2 上面方法计算内存对吗 1.3 一个像素占用多大内存 02.Bitmap常见四种颜色格式 2.1 什么是bitmap 2. ...
- 记录--在Vue3这样子写页面更快更高效
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能.而不 ...
- Chrome浏览器使用小技巧
前言 Notes made by IT-Pupil-Poo-Poo-Cai(IT小学生蔡坨坨). The notes are for reference only. Personal blog:www ...
- 初识Hbase架构以及数据读写(尚硅谷)
- #排列组合,dp#LOJ 6069 「2017 山东一轮集训 Day4」塔
题目传送门 分析 两点之间的最小距离其实是由两点高度最大值决定的, 求出长度为 \(n\) 的排列所需距离的方案数,剩下还能放的距离可以用插板法放进去. 也就是 \(\sum_{i=1}^{n^2}f ...
- #贪心#洛谷 6093 [JSOI2015]套娃
题目 分析 按好看度从大到小排序,每次选择一个尽量大的外径装入当前套娃的内径, 这样可以保证是最优的,删除选完的外径可以用平衡树实现 代码 #include <cstdio> #inclu ...