首页 > 编程语言 >力扣34(java)-在排序数组中查找元素的第一个和最后一个位置(中等)

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

时间:2022-11-22 23:56:52浏览次数:48  
标签:right java target nums int mid 34 力扣 left

题目:

给你一个按照非递减顺序排列的整数数组 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 }

标签:right,java,target,nums,int,mid,34,力扣,left
From: https://www.cnblogs.com/liu-myu/p/16914313.html

相关文章

  • Head First Java 读书笔记 17章
    第17章:包、jar存档文件和部署(发布程序)Java程序,是由一组类所组成的,这就是开发过程的输出。本章将讨论如何组织、包装和部署Java程序。如何组织Java代码文件?组织代码文件......
  • Head First Java 读书笔记 16章
    有哪些常用的集合?ArrayListTreeSet以有序状态保存并可防止数据重复HashMap以键值对的形式保存数据LinkedList针对经常插入或删除中间元素所设计的高效率集合HashSe......
  • 随机打乱数组--java实现
    参考链接听说过java.utils.Random随机数是伪随机,但是Math库还没学,所以下面代码中还是用的Randompublicstaticint[]shuffle(int[]arr){Randomr=newRandom(......
  • Java 用Lambda实现一个通用的制造者工具
    在我们日常开发中,虽然是用了lombok在实体类中已经帮我们省了get、set方法,但是在公司的项目中,还是经常会出现new一个对象然后一个个的给它set值的情况,太丑了,如下图List<St......
  • javaSE基础-数组
    数组数组的简述1、数组:是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行同一管理2、数组的相关概念:数组名元素角标、下标、......
  • JAVA- 动漫美女拼图(给按钮添加事件)
    代码一packagecom.itheima_05;publicclassApp{publicstaticvoidmain(String[]args){PictureFramepf=newPictureFrame();}}代码二pa......
  • JAVA- 动漫美女拼图(记录0号图片位置)
    代码一packagecom.itheima_02;publicclassApp{publicstaticvoidmain(String[]args){PictureFramepf=newPictureFrame();}}代码二pa......
  • Java多线程 线程池的生命周期及运行状态
    (目录)一、说明线程池的生命周期线程池的状态runState和工作线程数量workerCount共同保存在AtomicInteger类型的控制变量ctl中ctl高三位保存运行状态(2^3^=8>5),低2......
  • java爬虫
    创建Maven工程加入依赖<!--https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient--><dependency><groupId>org.apache.httpcomponents</gr......
  • 【JAVA笔记】jJAVA入门基础02
     一.符号及类型1.1添加注释comment注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行......