34. 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 ( l o g n ) O(log n) O(logn).
If the target is not found in the array, return [-1, -1].
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
solution 1: two pointer
由于是sorted array,最直观的解法就是two pointer分别从两边向中间扫描,但是这样的解法复杂度是 O ( n ) O(n) O(n),不满足题目要求,如果想达到 O ( l o g n ) O(log n) O(logn),必须采用binary search。
solution 2: binary search
需要注意的是,target不存在的情况,以及target在nums中有duplicates的情况。 为了考虑duplicates,一发现nums[mid] == target,就把这个mid当作结果的candidates,分别向两边扫描,找到target第一次和最后一次出现的index
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = {-1,-1};
if (nums == null ) return res;
int lo = 0;
int hi = nums.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (target > nums[mid]) {
lo = mid + 1;
} else if (target < nums[mid]) {
hi = mid - 1;
} else if (target == nums[mid]) {
int right = mid;
int left = mid;
while (right+1 < nums.length && nums[right+1] == target) {
right++;
}
while (left-1 >= 0 && nums[left-1] == target) {
left--;
}
res[0] = left;
res[1] = right;
break;
}
}
return res;
}
}
// public int BinarySearch(int[] nums, int target) {
// int res = -1
// if (nums == null || nums.length == 0) return res;
// int lo = 0;
// int hi = nums.length - 1;
// while(lo <= hi) {
// int mid = lo + (hi - lo) / 2;
// if (nums[mid] > target) {
// hi = mid - 1;
// } else if (nums[mid] == target) {
// hi = mid;
// } else {
// lo = mid + 1;
// }
// }
// return nums[lo] == target ? lo:-1;
// }