34、在排序数组中查找数字的第一个位置和最后一个位置
给定一个按照升序排列的整数数组 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]
解题思路
- 二分查找的应用
- 在找到元素时,进一步判断是否是第一个
java代码
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
res[0] = findFirst(nums,target);
if (res[0] == -1) res[1] = -1;
else res[1] = findLast(nums,target,res[0]);
return res;
}
private int findFirst(int[] nums,int target){
int l = 0;
int r = nums.length - 1;
while (l <= r) {
int mid = (l + r + 1) >> 1;
if (nums[mid] == target) { // 找到第一个数字
if ((mid > 0 && nums[mid - 1] != target) || mid == 0) return mid;
else r = mid - 1;
} else if (nums[mid] > target) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return -1;
}
private int findLast(int[] nums,int target,int first) {
int l = first;
int len = nums.length;
int r = len - 1;
while (l <= r) {
int mid = (l + r + 1) >> 1;
if (nums[mid] == target) {
if (mid == len - 1 || (mid < len - 1 && nums[mid + 1] != target)) return mid;
else l = mid + 1;
} else if (nums[mid] > target) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return -1;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com