剑指 Offer 53 - I. 在排序数组中查找数字 I
题目描述
统计一个数字在排序数组中出现的次数
示例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 <= 10^5
- -10^9 <= nums[i] <= 10 ^9.
- nums 是一个非递减数组
- -10^ 9 <= target <= 10^9
思路
-
如果不考虑时间复杂度的话,用一个变量count记录数字target在数组出现的次数直接通过for循环遍历即可。
-
二分查找,原理都懂,定义left right指针以及mid,很快可以找到目标数target,但是遇到一个问题就是次数怎么去统计。
次数统计:
- 通过二分法查找到目标数字
- 确定左右边界
- 左边界:nums[i]!===target || i=0
- 有边界:nums[i]!===target || i=nums.length
代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let left = 0;
let n = nums.length;
let right=n-1;
let result = 0;
while (left < right){
let mid=Math.floor((left+right)/2);
if(nums[mid]>target){
right=mid-1;
}
else if(nums[mid]<target){
left=mid+1;
}else{
//查找到target 退出循环
left=mid;
break;
}
}
// nums数组没有target 返回0
if(nums[left]!==target) return 0;
// 向左查找 统计
let sch=left-1;
while(nums[sch]===target&&sch>=0){
sch--;
result++;
}
// 向右查找 统计
while(nums[left]===target&&left<n){
left++;
result++;
}
return result;
};