【剑指offer】数字在排序数组中出现的次数

题目链接:数字在排序数组中出现的次数


题意:统计一个数字在排序数组中出现的次数。

 

题解:暴力可过!但是。这题很明显不是让我们用暴力。既然是一个排序数组。自然想到二分。

举例: 1 2 2 2 3

二分第一次出现的位置,1;二分最后一次出现的位置:3;ans = last - first + 1

二分的时候,一个总往前找,一个总往后找就行了

 

代码:

 1 class Solution {
 2 public:
 3     int GetNumberOfK(vector<int> data ,int k) {
 4         int len = data.size();
 5         int cnt = 0;
 6         for(int i = 0; i < len ;i++){
 7             if(data[i] == k){
 8                 cnt++;
 9             }
10         }
11         return cnt;  
12     }
13 
14 };
15 
16 OR
17 
18 class Solution {
19 public:
20     int GetNumberOfK(vector<int> data ,int k) {
21         int first = BinSearch1(data,k);
22         int last = BinSearch2(data,k);
23         if(first == -1 || last == -1)    return 0;
24         else    return (last - first + 1);
25     }
26     //第一次出现
27     int BinSearch1(vector<int> data, int k){
28         int len = data.size();
29         int low = 0; int high = len-1;
30         while(low <= high){
31             int mid = (low+high)/2;
32             if(data[mid] < k)    low = mid + 1;
33             else if(data[mid] > k)    high = mid - 1;
34             else {
35                 if((data[mid-1] == k) && (mid-1 >= 0)){
36                     high = mid-1;
37                 }
38                 else    return mid; 
39            }
40         }
41         return -1;
42     }
43     //最后一次出现
44     int BinSearch2(vector<int> data, int k){
45         int len = data.size();
46         int low = 0; int high = len - 1;
47         while(low <= high){
48             int mid = (low+high)/2;
49             if(data[mid] < k)    low = mid + 1;
50             else if(data[mid] > k)    high = mid - 1;
51             else{ 
52                 if((data[mid+1] == k) && (mid+1 < len)){
53                     low = mid + 1;
54                 }
55                 else    return mid;
56             }
57         }
58         return -1;
59     }
60 };

 

posted @ 2020-03-04 22:21  甜酒果。  阅读(164)  评论(0编辑  收藏  举报