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

Posted asumi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 };

 

以上是关于剑指offer数字在排序数组中出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer——数字在排序数组中出现的次数

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

剑指offer(二十七)之数字在排序数组中出现的次数

剑指offer 37.数字在排序数组中出现的次数

剑指OFFER 数字在排序数组中出现的次数

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