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

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

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

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

示例 1:

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

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

logn级别的时间复杂度,可以直接想到二分法,分两次查找,第一次查找左边界,第二次查找右边界。

 1 class Solution {
 2 public:
 3     vector<int> searchRange(vector<int>& nums, int target) {
 4         if(nums.size()==0) return {-1,-1};
 5         int l=0,r=nums.size()-1,m;
 6         int retl=-1,retr=-1;
 7         //find left
 8         while(l<r-1){
 9             m=(l+r)/2;
10             if(nums[m]<target){
11                 l=m+1;
12             }
13             else if(nums[m]>target){
14                 r=m-1;
15             }
16             else if(nums[m-1]==nums[m]){
17                 r=m-1;
18             }
19             else{
20                 retl=m;
21                 break;
22             }
23         }
24         if(retl==-1){
25             if(nums[l]==target) retl=l;
26             else if(nums[r]==target) retl=r;
27             else return {-1,-1};
28         }
29         l=0,r=nums.size()-1;
30         //find right
31         while(l<r-1){
32             m=(l+r)/2;
33             if(nums[m]<target){
34                 l=m+1;
35             }
36             else if(nums[m]>target){
37                 r=m-1;
38             }
39             else if(nums[m+1]==nums[m]){
40                 l=m+1;
41             }
42             else{
43                 retr=m;
44                 break;
45             }
46         }
47         if(retr==-1){
48             if(nums[r]==target) retr=r;
49             else if(nums[l]==target) retr=l;
50         }
51         
52         return {retl,retr};
53     }
54 };

附上一个更加高效的写法,别人的思维真的很精准。

 1 class Solution {
 2 public:
 3     vector<int> searchRange(vector<int>& nums, int t) {
 4         if(nums.size()==0)return {-1,-1};
 5         vector<int> res;
 6         int l = 0, r = nums.size() - 1;
 7 
 8         //二分查找数组的性质 >=t 和 <=t
 9         //先二分左边边界 >=t
10         while (l < r) {
11             int mid = l + r >> 1;
12             if (nums[mid] >= t)    r = mid;
13             else l = mid + 1;
14         }
15         //判断是否有t 没有直接返回-1 -1
16         if (nums[l] != t) return { -1,-1 };
17         else {
18             res.push_back(l);
19             l = 0, r = nums.size() - 1;
20             //右边边界 <=t 
21             while (l < r) {
22                 int mid = l + r +1>> 1;
23                 if (nums[mid] <= t) l = mid;
24                 else r = mid - 1;
25             }
26         }
27         res.push_back(l);
28         return res;
29 
30     }
31 };
32 
33 作者:ni-hen-you-xiu-2
34 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/c-er-fen-cha-zhao-ying-yong-by-ni-hen-you-xiu-2/
35 来源:力扣(LeetCode)
36 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/rookiez/p/13202715.html