二分查找的变形,统计数字在排序数组出现的次数

当在排序数组中查找数字时,首选的方法为二分查找法

 1 class Solution {
 2 public:
 3     int GetFirstK(vector<int>data,int k,int start,int end)
 4         {
 5         if(start>end)
 6             return -1;
 7         int middle=(start+end)/2;
 8         int middledata=data[middle];
 9         if(middledata==k)
10             {
11             if((middle>0&&data[middle-1]!=k)||middle==0)//当midlle的左边没有k了,此时middle的位置为第一个k的位置
12                 return middle;
13             else
14                 end=middle-1;//否则应该从start到middle-1重新查找
15         }
16         else if(middledata>k)
17             end=middle-1;
18         else
19             start=middle+1;
20         return GetFirstK(data,k,start,end);
21         
22     }
23     int GetLastK(vector<int>data,int k,int start,int end)
24         {
25         if(start>end)
26             return -1;
27         int middle=(start+end)/2;
28         int middledata=data[middle];
29         if(middledata==k)
30             {
31             if((middle<data.size()&&data[middle+1]!=k)||middle==data.size()-1)//当middle的右边没有k是,此时的middle就是最后一个k
32                 return middle;
33             else
34                 start=middle+1;//否则要从middle+1查找
35         }
36         else if(middledata>k)
37             end=middle-1;
38         else
39             start=middle+1;
40         return GetLastK(data,k,start,end);
41         
42     }
43     int GetNumberOfK(vector<int> data ,int k) {
44         /*int len=data.size();
45         if(len==0) return 0;
46        
47         int count=0;
48         for(int i=0;i<data.size();i++)
49          {
50             if(data[i]==k) count++;
51         }
52         return count;*/
53         int number=0;
54         if(data.size()>0)
55             {
56             int first=GetFirstK(data,k,0,data.size()-1);
57             int last=GetLastK(data,k,0,data.size()-1);
58             if(first>-1&&last>-1)
59                 number=last-first+1;
60         }
61         return number;
62     }
63 };

 

转载于:https://www.cnblogs.com/ranranblog/p/5717839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值