🌕 34. 在排序数组中查找元素的第一个和最后一个位置
2022年6月9日
- algorithm
🌕 34. 在排序数组中查找元素的第一个和最后一个位置
难度: 🌕
问题描述
解法
class Solution {
public int[] searchRange(int[] nums, int target) {
// 思路:
// 二分
int len = nums.length;
int[] res = new int[2];
res[0] = mySol(nums, target, 0, len - 1, true);
res[1] = mySol(nums, target, 0, len - 1, false);
return res;
}
private int mySol(int[] nums, int target, int left, int right, boolean first) {
// 递归终止条件
if(left > right) {
return -1;
}
if(left == right) {
if(nums[left] == target) {
return left;
} else {
return -1;
}
}
int mid = left + ((right - left) >> 1);
if(target > nums[mid]) {
left = mid + 1;
return mySol(nums, target, left, right, first);
} else if(target < nums[mid]) {
right = mid - 1;
return mySol(nums, target, left, right, first);
} else {
// target == nums[mid]
if(first) {
// 找首次出现的位置 - 跟左边界值比较,看能否缩小左边界
if(target > nums[left]) {
left ++;
return mySol(nums, target, left, right, first);
} else {
// target == nums[left]
return left;
}
} else {
// 找最后一次出现的位置
if(target < nums[right]) {
right --;
return mySol(nums, target, left, right, first);
} else {
return right;
}
}
}
}
}