剑指 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;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)