剑指offer-面试题53_1-在排序数组中查找数字-二分查找
2024-09-05 19:22:42
/*
题目:
统计一个数字在排序数组中出现的次数。
*/
/*
思路:
1、从前往后遍历,时间复杂度O(n)。
2、二分查找到目标数字target,向前向后遍历,时间复杂度O(n)。
3、利用二分法,递归找到数字出现的第一个位置和最后一个位置,时间复杂度O(logn)。
*/
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map> using namespace std; int getFirstOfK(vector<int> &A,int start,int end, int target){
if(start > end) return -1; int mid = (start + end) / 2;
if(A[mid] > target){
return getFirstOfK(A,start,mid-1,target);
}else if(A[mid] < target){
return getFirstOfK(A,mid+1,end,target);
}else{
if(mid == 0 || A[mid-1] != target){
return mid;
}else{
return getFirstOfK(A,start,mid-1,target);
}
}
} int getLastOfK(vector<int> &A,int start,int end,int target){
if(start > end) return -1; int mid = (start+end) / 2;
if(A[mid] > target){
return getLastOfK(A,start,mid-1,target);
}else if(A[mid] < target){
return getLastOfK(A,mid+1,end,target);
}else{
if(mid == end || A[mid+1] != target){
return mid;
}else{
return getLastOfK(A,mid+1,end,target);
}
}
} int getNumbersOfK(vector<int> &A, int target){
int first = getFirstOfK(A,0,A.size()-1,target);
int last = getLastOfK(A,0,A.size()-1,target); if(last != -1 && first != -1){
return last - first + 1;
}
return 0; } int main(){
vector<int> a = {1,1,3,4,4,4,5};
cout<<getNumbersOfK(a,1);
}
最新文章
- 《jQuery判断radio、checkbox、select 是否选中和设置选中问题以及获取选中值》总结
- 剑指Offer面试题:10.数值的整数次方
- Tableau(数据抽取)
- LeetCode 371. Sum of Two Integers
- 【Python】pip国内安装源
- JBOSS内存参数详解
- SQLServer 批量插入数据的两种方法
- 。net 添加或获取文件关联
- rsyslog 日志统一搜集&message格式
- 【hadoop】mapreduce原理总结
- zipline tradingcalendar
- Converting Storyboard from iPhone to iPad
- myeclipse快速开发配置
- 如何用Java语言向串口读写数据
- Spark standalone安装(最小化集群部署)
- [c#]asp.net开发微信公众平台(5)微信图文消息
- socket在windows下和linux下的区别
- 用div画三角/矩形/圆
- LeetCode 797. All Paths From Source to Target
- Kubernetes 笔记 02 demo 初体验