day40:67. 数字在排序数组中出现的次数(二分查找)
程序员文章站
2024-03-20 11:41:52
...
问题描述:
统计一个数字在排序数组中出现的次数。
例如输入排序数组[1, 2, 3, 3, 3, 3, 4, 5]和数字3,由于3在这个数组中出现了4次,因此输出4。
样例
- 输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3
- 输出:4
使用二分搜索,只不过是经典案例的改编,经典案例是寻找一个数字,该数字并不是重复的,而本题目是寻找一个数字出现的次数,该数字会出现多次,折半查找的思路是:
1)设置初始查找区间:low=0,high=n-1
2)测试查找区间是否存在,如果不存在,则查找失败,否则
3)取中间点mid=(low+high)/2 比较k 和 rmid,有三种情况:
- k<rmid high=mid-1,查找在左半区进行,转步骤2
- k>rmid low=mid+1,查找在右半区进行,转步骤2
- k=rmid,则查找成功,返回记录在表中的位置
只不过在该题中不需要k=rmid这一步,只需要找到左右边界,然后相减即可得到该数字出现的次数。
class Solution {
public:
int getNumberOfK(vector<int>& nums , int k) {
if(nums.empty()) return 0;
int l=0,r=nums.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(nums[mid]<k) l=mid+1;
else r=mid;
}
if(nums[l]!=k) return 0;
int left=l;
l=0,r=nums.size()-1;
while(l<r)
{
int mid= l+r+1>>1;//注意加一防止陷入死循环
if(nums[mid]<=k) l=mid;
else r=mid-1;
}
return r-left+1;
}
};
上一篇: (二十九)会话跟踪技术总结(Cookie、Session)
下一篇: 会话跟踪技术
推荐阅读
-
day40:67. 数字在排序数组中出现的次数(二分查找)
-
写代码可以在整型有序数组中查找想要的数字(二分查找)
-
在一个有序(增序)数组中查找具体的某个数字n 与二分法查找算法
-
[PHP] 算法-统计一个数字在排序数组中出现的次数的PHP实现
-
在排序数组中,找出给定数字的出现次数.比如 [1, 2, 2, 2, 3] 中
-
「力扣」第 34 题:在排序数组中查找元素的第一个和最后一个位置(二分查找)
-
[PHP] 算法-统计一个数字在排序数组中出现的次数的PHP实现
-
PHP实现统计一个数字在排序数组中出现次数的方法
-
在一个非降序排列的数组中,找出数字target出现的次数问题解答
-
牛客之数字在排序数组中出现的次数