劍指offer-數字在排序陣列中出現的次數(陣列)
阿新 • • 發佈:2018-12-13
題目描述
統計一個數字在排序陣列中出現的次數。
方法一:最簡單粗暴的方法就是遍歷!等於k就令count+1。這個方法是時間複雜度是O(n)。
class Solution{ public: int GetNumberOfK(vector<int> data,int k){ if(data.size()<0) return 0; int count=0; for(int i=0;i<data.size();i++) { if(data[i]==k) count++; } return count; } };
方法二:二分法!有人說看到有序陣列就要想到二分法!
用二分法找到這個數第一次出現和最後一次出現的下標。二分法的時間複雜度是O(logn)
class Solution { public: int GetNumberOfK(vector<int> data ,int k) { return getlast(data,k)-getfirst(data,k)+1; } int getfirst(vector<int> data,int k){ int start=0,end=data.size()-1; int mid; while(start<=end){ mid=(start+end)/2; if(data[mid]<k) start=mid+1; else end=mid-1; } return start; } int getlast(vector<int> data,int k){ int start=0,end=data.size()-1; int mid; while(start<=end){ mid=(start+end)/2; if(data[mid]<=k) start=mid+1; else end=mid-1; } return end; } };
方法三:同樣是基於二分法的思想,但是想法更加巧妙(這個方法是討論區裡的大神寫的,也一起總結到這裡)
因為陣列中的數是整數,所以加減0.5後,這個數可以插入到陣列中的哪個位置,然後相減
class Solution{ public: int GetNumberOfK(vector<int> data,int k){ return find(data,k+0.5)-find(data,k-0.5); } int find(const vector<int> data,double num) { int start=0,end=data.size()-1; while(start<=end) { int mid=(start+end)/2; if(data[mid]<num) start=mid+1; else end=mid-1; } return start; } };