Search for a Range Medium
Given an array of integers 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].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
public int[] searchRange(int[] nums, int target) {
int[] ans = { -1, -1 };
ans[0] = firstPlaceLeft(nums, target);
ans[1] = firstPlaceRight(nums, target);
return ans;
}
private static int firstPlaceLeft(int[] nums, int target) {
int l = 0, r = nums.length - 1, mid = 0;
while (l <= r) {
mid = (l + r) / 2;
if (target > nums[mid])
l = mid + 1;
else {
if (nums[mid] == target && (mid == l || (mid > l && nums[mid - 1] != target))) {
return mid;
}
r = mid - 1;
}
}
return -1;
}
private static int firstPlaceRight(int[] nums, int target) {
int l = 0, r = nums.length - 1, mid = 0;
while (l <= r) {
mid = (l + r) / 2;
if (target < nums[mid])
r = mid - 1;
else {
if (nums[mid] == target && (mid == r || (mid < r && nums[mid + 1] != target))) {
return mid;
}
l = mid + 1;
}
}
return -1;
}
思路:使用两个变形的二分查找,分别找第一个、最后一个等于给定数的位置。
本文介绍了一种在有序整数数组中查找目标值起始和结束位置的算法,通过两次二分查找,实现O(log n)的时间复杂度。示例中,对于数组[5,7,7,8,8,10]及目标值8,返回[3,4]。
452

被折叠的 条评论
为什么被折叠?



