Leetcode-34 Find First and Last Position of Element in Sorted Array

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 a given target value.

Your algorithm’s runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1

1
2
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Example 2

1
2
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

解题思路

分别用二分法找出目标的左边界和右边界。找左边界时,若 nums[mid]>=target,二分搜索的上界 r=mid-1,否则二分搜索的下界 l=mid+1,最后返回 r+1。找右边界时,若 nums[mid]<=target,二分搜索的下界 l=mid+1,否则二分搜搜的上界 r=mid-1,最后返回 l-1。若左边界大于右边界,说明 nums 中不存在target,返回 [-1,-1];否则,返回左右边界。

复杂度分析

  • 时间复杂度:$O(logn)$。
  • 空间复杂度:$O(1)$。

代码

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