🌕 剑指 Offer 53 - I. 在排序数组中查找数字 I
2022年10月10日
- algorithm
🌕 剑指 Offer 53 - I. 在排序数组中查找数字 I
难度: 🌕
问题描述
解法
class Solution {
public int search(int[] nums, int target) {
// 思路:
// 2 次二分,分别找首次出现下标 & 末尾出现下标
int len = nums.length;
if(len == 0) {
return 0;
}
int left = mySol(nums, target, 0, len - 1, true);
if(left < 0) {
return 0;
}
int right = mySol(nums, target, 0, len - 1, false);
return right - left + 1;
}
private int mySol(int[] nums, int target, int left, int right, boolean first) {
// 递归终止条件
if(left >= right) {
if(nums[left] == target) {
return left;
} else {
return -1;
}
}
// left < right
int mid = left + ((right - left) >> 1);
if(target > nums[mid]) {
return mySol(nums, target, mid + 1, right, first);
} else if(target < nums[mid]) {
return mySol(nums, target, left, mid - 1, first);
} else {
// target == [mid]
if(first) {
// 找首个出现下标
return mySol(nums, target, left, mid, first);
} else {
if(nums[mid + 1] != target) {
return mid;
} else {
return mySol(nums, target, mid + 1, right, first);
}
}
}
}
}