题目描述
统计一个数字在排序数组中出现的次数。
解题思路:本题因为数组是有序的,因此采用二分查找的方式找到k,要知道k出现次数,先找到第一个k出现的位置,再找到最后一个k出现的位置,最后k出现次数为last-first+1
1 class Solution { 2 public: 3 //通过二分法找到数组中第一个k出现位置 4 int GetFirstK(vector<int> data,int length, int k, int start, int end) 5 { 6 if(start > end) 7 return -1; 8 int middleIndex = (start+end)/2; 9 int middleData = data[middleIndex]; 10 if(middleData == k) 11 { 12 if((middleIndex > 0 && data[middleIndex-1] != k) || (middleIndex == 0))//middleIndex为第一个k位置 13 { 14 return middleIndex; 15 } 16 else//在左侧 17 { 18 end = middleIndex - 1; 19 } 20 } 21 else if(middleData > k) 22 { 23 end = middleIndex - 1; 24 } 25 else 26 { 27 start = middleIndex + 1; 28 } 29 return GetFirstK(data,length,k,start,end); 30 } 31 //通过二分法找到数组中最后一个k出现位置 32 int GetLastK(vector<int> data,int length, int k, int start, int end) 33 { 34 if(start > end) 35 return -1; 36 int middleIndex = (start+end)/2; 37 int middleData = data[middleIndex]; 38 if(middleData == k) 39 { 40 if((middleIndex<length-1 && data[middleIndex+1] != k) || (middleIndex == length - 1))//恰为最后一个 41 { 42 return middleIndex; 43 } 44 else 45 { 46 start = middleIndex+1; 47 } 48 } 49 else if(middleData > k)//左侧 50 { 51 end = middleIndex - 1; 52 } 53 else 54 { 55 start = middleIndex + 1; 56 } 57 return GetLastK(data,length,k,start,end); 58 } 59 int GetNumberOfK(vector<int> data ,int k) 60 { 61 int num = 0; 62 int length = data.size(); 63 if(!data.empty() && length >0) 64 { 65 int first = GetFirstK(data,length,k,0,length-1); 66 int last = GetLastK(data,length,k,0,length-1); 67 if(first > -1 && last > -1) 68 { 69 num = last - first + 1; 70 } 71 } 72 return num; 73 } 74 };