34.在排序数组中查找第一个和最后一个位置
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
- 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
思考:
- 复习二分查找
public class Solution1 {
/**
* 在排序数组中查找第一个和最后一个位置
* 输入:nums = [5,7,7,8,8,10], target = 8
* 输出:[3,4]
*/
public int[] searchRange(int[] nums, int target) {
if (nums.length == 0) {
return new int[]{-1, -1};
}
return new int[]{binarySort1(nums, target), binarySort2(nums, target)};
}
/**
* 返回>=t的第一个下标
*/
private int binarySort1(int[] nums, int t) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < t) {
left++;
} else if (nums[mid] > t) {
right--;
} else {
if (mid == 0 || nums[mid - 1] < t) {
return mid;
}
right--;
}
}
return -1;
}
/**
* 返回<=t的第一个下标
*/
private int binarySort2(int[] nums, int t) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < t) {
left++;
} else if (nums[mid] > t) {
right--;
} else {
if (mid == nums.length - 1 || nums[mid + 1] > t) {
return mid;
}
left++;
}
}
return -1;
}
public static void main(String[] args) {
Solution1 solution = new Solution1();
int[] nums = {5, 7, 7, 8, 8, 10};
int t = 8;
System.out.println(Arrays.toString(solution.searchRange(nums, 8)));
}
}