【剑指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 };