剑指 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
解法一:二分查找
由于数组 nums 中元素都为整数,因此可以分别二分查找 target 和 target - 1 的右边界,将两结果相减并返回即可。
本质上看, helper() 函数旨在查找数字 tar 在数组 nums 中的 插入点 ,且若数组中存在值相同的元素,则插入到这些元素的右边。
var search = function(nums, target) {
return helper(nums, target) - helper(nums, target - 1);
}
const helper = (arr, tar) => {
let i = 0, j = arr.length - 1;
while(i <= j) {
let mid = Math.floor((i + j) / 2)
if(arr[mid] <= tar){
i = mid + 1;
}else{
j = mid - 1;
}
}
return i;
}
解法二:首尾双指针
var search = function(nums, target) {
if(!nums.length) return 0
let i = 0, j = nums.length - 1
while(nums[i] < target){
i ++
}
while(nums[j] > target){
j --
}
return j - i + 1
};