剑指 Offer 53 - I. 在排序数组中查找数字 I
| 难度 | 简单 | 通过率 | 54.1% (151473/279954) |
|---|
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
- 0 <=
nums.length<= 50000
题解
二分查找,找左边界
- 这种题目,要是没有其他要求,就只用
二分查找来做就好了 - 唯一比较麻烦的就是两个边界的确定以及其溢出问题:
左边界、右边界 - 本题很明显是需要找到有效下标,即
第一个 >=target 的下标- 对应的就是
求 最小满足值,其下标范围为[0, n) - 确定了
左边界,寻找右边界的时候,要注意边界溢出的问题
- 对应的就是
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int count = 0;
while (left < right) {
int mid = left + (right - left) / 2; // 防因为right过大而溢出
if(nums[mid] >= target) // 偏大
right = mid;
else if(nums[mid] < target) // 偏小
left = mid + 1;
}
// 必选先判断left<nums.length, 因为left++, 否则会边界溢出
// 是left++, 不是++left, 别搞错啦
while (left < nums.length && nums[left++] == target)
count++;
return count;
}
}
时间复杂度:
空间复杂度: