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

你的算法时间复杂度必须是 O(log n) 级别。

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

示例 1:

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

示例 2:

  1. 输入: nums = [5,7,7,8,8,10], target = 6
  2. 输出: [-1,-1]
    ------------------
  3.  
  4. 思路:
      这题主要要求时间复杂度是O(log n), 所以对于一个排好序的数组,第一时间想到 二分法查找。
      步骤:1、先用二分法查找,找到一个target,作为一个基准点mid
         2、从mid往左,二分法查找,找到最左边缘
         3、从mid往右,二分法查找,找到最右边缘
  5.  
  6. 如果不用二分法查找,那就从左右两头往中间靠拢查找,复杂度为O(n)
  1. public int[] searchRange(int[] nums, int target) {
  2. int[] res = new int[2];
  3. int mid = binarySearch(nums, target, 0, nums.length - 1);
  4. if (mid == -1) {
  5. res[0] = -1;
  6. res[1] = -1;
  7. return res;
  8. }
  9. int left = searchRangeLeft(nums, target, 0, mid - 1);
  10. int right = searchRangeRight(nums, target, mid + 1, nums.length - 1);
  11. if (left == -1) {
  12. res[0] = mid;
  13. } else {
  14. res[0] = left;
  15. }
  16. if (right == -1) {
  17. res[1] = mid;
  18. } else {
  19. res[1] = right;
  20. }
  21.  
  22. return res;
  23.  
  24. }
  25.  
  26. private int binarySearch(int[] nums, int key, int start, int end) { //返回查到的下标
  27. if (start > end) {
  28. return -1;
  29. }
  30. int mid = (start + end) / 2;
  31. if (nums[mid] == key) {
  32. return mid;
  33. } else if (nums[mid] > key) {
  34. return binarySearch(nums, key, start, mid - 1);
  35. } else {
  36. return binarySearch(nums, key, mid + 1, end);
  37. }
  38. }
  39.   
  40.  
  41.   //往左查找
  42. private int searchRangeLeft(int[] nums, int target, int start, int end) {
  43. if (start > end) { //退出递归条件
  44. return -1;
  45. }
  46. int mid = (start + end) / 2;
  47. if (nums[mid] == target) { //命中,继续从mid往左寻找:1.若未找到,返回mid 2.若找到,返回找到的下标
  48. return searchRangeLeft(nums, target, start, mid - 1) == -1 ? mid : searchRangeLeft(nums, target, start, mid - 1);
  49. } else {//未命中,从mid往右找
  50. return searchRangeLeft(nums, target, mid + 1, end);
  51. }
  52. }
  53. //往右查找
  54. private int searchRangeRight(int[] nums, int target, int start, int end) {
  55. if (start > end) { //退出递归条件
  56. return -1;
  57. }
  58. int mid = (start + end) / 2;
  59. if (nums[mid] == target) {//命中,继续从mid往右寻找。1.若未找到,返回mid 2.若找到,返回找到的下标
  60. return searchRangeRight(nums, target, mid + 1, end) == -1 ? mid : searchRangeRight(nums, target, mid + 1, end);
  61. } else {//未命中, 从mid 往左找
  62. return searchRangeRight(nums, target, start, mid - 1);
  63. }
  64. }

leetcode34. 在排序数组中查找元素的第一个和最后一个位置的更多相关文章

  1. [Swift]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 | Find First and Last Position of Element in Sorted Array

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  2. LeetCode34.在排序数组中查找元素的第一个和最后一个位置 JavaScript

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. shiro的Quickstart

    /** * Simple Quickstart application showing how to use Shiro's API. * * @since 0.9 RC2 */ public cla ...

  2. PHP CI 框架简单使用(二)

    我们简单认识一下CI框架的MVC.示例代码如下 //CI控制器文件Home.php <?php defined('BASEPATH') OR exit('No direct script acc ...

  3. Kotlin之注释

    kotliin中注释和java注释是一样的,支持单行注释和多行注释,但kotlin支持嵌套,java不支持

  4. Vs code工具汉化

    官网为:https://code.visualstudio.com/ 看到中间有一些提示的命令 选择第一条,即Ctrl+shift+P,弹出命令行,选择"Configure Display ...

  5. python获取豆瓣日记

    最近迷上了看了四个春天,迷上了饭叔的豆瓣日记,想全部抓取下来,简单了写了下面的脚本 import urllib.request import os from bs4 import BeautifulS ...

  6. flutter 屏幕宽高 状态栏高度

    MediaQuery.of(context) 包含了一些屏幕的属性: size : 一个包含宽度和高度的对象,单位是dp print(MediaQuery.of(context).size); //输 ...

  7. linux(centOS7)的基本操作(五) 磁盘、分区、挂载、卸载

    linux的磁盘类型和分区简介 linux的磁盘分为IDE和SCSI,目前以后者居多. 1. IDE磁盘的分区:hd+盘号+分区数字 盘号 |-a:基本盘 |-b:基本从属盘 |-c:辅助主盘 |-d ...

  8. document的属性操作

    document对象: 1.直接操作: 对象.属性 = 值; 如下面一段代码: <a href  = "...">跳转</a> <script> ...

  9. 【HANA系列】SAP HANA XS Administration Tool登录参数设置

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS Admi ...

  10. 【ABAP系列】SAP 一个完整的SAP的Abap例子(idoc,edi文件的相互转换)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 一个完整的SAP的Aba ...