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

Posted V丶vvv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了34. 在排序数组中查找元素的第一个和最后一个位置相关的知识,希望对你有一定的参考价值。

题目描述查看:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/

  题目的意思是从一个有序的数组中,查找一个数,但是这个数是重复存在的,返回区间。题目要求的时间复杂度O(logn),提醒我们用到二分查找。

  • 思路

先用二分查找找到这个数,在创建新指针找数的左右边界。

当找到这个数的时候,设定l,r指针先指向这个数,然后左右扩展找边界。

 1 if(nums[mid] == target) {
 2     int l = mid;
 3     int r = mid;
 4     int i = 0;
 5     while(l >= left && r <= right){
 6         i++;
 7         if((mid-i >=0 && nums[mid -i] ==target) ||( mid + i < nums.length && nums[mid + i] == target)) {
 8             if (mid-i >=0 && nums[mid -i] ==target) l--;
 9             if (mid + i < nums.length && nums[mid + i] == target) r++;
10         } else {
11             result[0] = l;
12             result[1] = r;
13             return result;
14         }
15     }
16 }
  • 边界条件

7行要判断数组下标是否越界,然后以mid为中心,以i为左右移动的长度,进行判定。

 1     public static int[] search(int[] nums, int target) {
 2         int[] result = {-1,-1};
 3         if(nums.length == 0)return result;
 4         int left = 0;
 5         int right = nums.length - 1;
 6         while(left <= right){
 7             int mid = left +(right - left)/2;
 8             if(nums[mid] == target) {
 9                 int l = mid;
10                 int r = mid;
11                 int i = 0;
12                 while(l >= left && r <= right){
13                     i++;
14                     if((mid-i >=0 && nums[mid -i] ==target) ||( mid + i < nums.length && nums[mid + i] == target)) {
15                         if (mid-i >=0 && nums[mid -i] ==target) l--;
16                         if (mid + i < nums.length && nums[mid + i] == target) r++;
17                     } else {
18                         result[0] = l;
19                         result[1] = r;
20                         return result;
21                     }
22                 }
23             }
24             else if(nums[mid] > target)right = mid -1;
25             else
26                 left = mid +1;
27             }
28         return result;
29     }

 

以上是关于34. 在排序数组中查找元素的第一个和最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章

java刷题--34在排序数组中查找元素的第一个和最后一个位置

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

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

算法leetcode|34. 在排序数组中查找元素的第一个和最后一个位置(rust重拳出击)

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

leetcode-34在排序数组中查找元素的第一个和最后一个位置