題目:統計一個數字k在排序數組中出現的次數。例如輸入排序數組{1,2,3,3,3,3,4,5}和數字3,輸出4次
方案一:掃描數組,記錄第一個出現的k和最後一個k中間有多少個,時間復雜度為O(n)
方案二:由於數組是有序的,那麼我們可以利用二分的思想,求出k在數組中的第一個位置和最後位置相減即可。時間復雜度為O(logN)
注意嚴格按照良好的C++編碼風格
#include#include #include #include using namespace std; //規定沒有找到返回-1 int GetFirstIndex(int *arrNum, int left, int right, int k){ if(arrNum == NULL || left > right){ return -1; } while(left <= right){ int mid = (left+right)>>1; if(arrNum[mid] > k){ right = mid-1; } else if(arrNum[mid] < k){ left = mid+1; } else{ if((mid > 0) && (arrNum[mid-1] == k)){ right = mid-1; } else{ return mid; } } } return -1; } //規定沒有找到返回-1 int GetLastIndex(int *arrNum, int left, int right, int k){ if(arrNum == NULL || left > right){ return -1; } while(left <= right){ int mid = (left+right)>>1; if(arrNum[mid] > k){ right = mid-1; } else if(arrNum[mid] < k){ left = mid+1; } else{ if((mid < right-1) && (arrNum[mid+1] == k)){ left = mid+1; } else{ return mid; } } } return -1; } int main(){ int arrNum[] = {1,2,3,3,3,3,4,5}; //求出第一個和最後一個位置 int firstIndex = GetFirstIndex(arrNum, 0, 7, 3); int lastIndex = GetLastIndex(arrNum, 0, 7, 3); if(firstIndex != -1 && lastIndex != -1){ cout<<(lastIndex-firstIndex+1)<