统计一个数字在排序数组中出现的次数。
示例 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 <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109
最简单的方法就是排序遍历,挨个比对
但是题目中明确说明了非递减数组!一般提到非递减数组就会优先考虑二分查找,所以这道题的思路也是通过二分法定义边界去查找数字出现次数
情况
1.nums[mid]<target:target必定不会小于mid左侧的数据,所以左边界可以向右移动
2.nums[mid]>target:target必定不会小于mid右侧的数据,所以右边界可以向左移动
3.nums[mid]=target:所要找的数字就在mid周围,只要分别向左向右遍历即可得出答案
class Solution {
public int search(int[] nums, int target) {
if((nums.length==0)||(nums[0]>target)||(nums[nums.length-1]<target)){
return 0;
}
int low = 0,height = nums.length-1;
int mid = (height-low)/2+low;
while((low<height)&(nums[mid]!=target)){
if(nums[mid]<target){
low = mid+1;
}else if(nums[mid]>target){
height = mid-1;
}
mid = (height - low)/2+low;
}
int sum = 0;
if(low<=height){
for(int i=mid;(i>=0);i--)
if(nums[i]==target)
sum++;
for(int j=mid+1;j<nums.length;j++)
if(nums[j]==target)
sum++;
}
return sum;
}
}
我的解效率并不是很高,可以看大佬的代码
剑指 Offer 53 - I. 在排序数组中查找数字 I - 力扣(LeetCode) (leetcode-cn.com)