1.統計乙個數字在乙個排序陣列中出現的次數,例如陣列,找出3出現的次數4.
分析:最直觀的方法就是從頭到尾的掃瞄一遍陣列,逐個進行比對,統計出現的次數。這樣的時間複雜度是o(n)。但是考慮到是已經排序的陣列,如果乙個數字在陣列中出現的話,找乙個數字有很多種方法,例如二分查詢的方法,可以在o(lgn)的時間內找到該數字,考慮到這樣數字可能出現的次數由多次,我們可以找到出現的初始位置和結束位置,這樣兩個位置之間的元素就都是要找到的元素。
例如要找元素k的起始的位置,二分查詢的思想首先是找到陣列中間的元素與k進行比較,如果比k小,則要找的位置肯定在陣列的後半部分;如果比k大,則要找的位置在陣列的前半部分;如果相等的話,則往前再找乙個位置,如果前面的位置元素不是k,則當前的位置就是k出現的起始位置,如果前面的乙個元素也是k,則繼續用二分查詢的方法在前半部分找起始的位置。這樣演算法的時間複雜度是o(lgn)。可以用類似的方法來查詢k出現的結束的位置。這樣總共的時間複雜度是o(lgn)。
原始碼:
/**
* 功能說明:已排序陣列中某個元素出現的次數
* 日期:2016-9-8
**/#includeusing namespace std;
int getnumberofk(int* data, int length, int k);
//確定k首次出現的位置
int getfirstk(int* data, int length, int k, int start, int end);
//確定k最後出現的位置
int getlastk(int* data, int length, int k, int start, int end);
int main()
; int result = getnumberofk(data,sizeof(data)/sizeof(int),3);
cout << "the result is: " << result << endl;
system("pause");
return 0;
}int getnumberofk(int* data, int length, int k)
return number;
}// 找到陣列中第乙個k的下標。如果陣列中不存在k,返回-1
int getfirstk(int* data, int length, int k, int start, int end)
else if (middledata > k)
end = middleindex - 1;
else
start = middleindex + 1;
return getfirstk(data, length, k, start, end);
}// 找到陣列中最後乙個k的下標。如果陣列中不存在k,返回-1
int getlastk(int* data, int length, int k, int start, int end)
else if (middledata < k)
start = middleindex + 1;
else
end = middleindex - 1;
return getlastk(data, length, k, start, end);
}
面試題38 數字在排序陣列中出現的次數
問題說明 1.給定排序的陣列,例如從小到大已經排序。2.給定某個查詢關鍵字,求出該關鍵字出現的次數。3.完全遍歷一遍,時間複雜度為o n 並未充分利用排序的資訊。4.需要借鑑二分查詢的思想改進,演算法的時間複雜度為o logn package com.zhang.csdn author pizi d...
面試題38 數字在排序陣列中出現的次數
統計乙個數字在排序陣列中出現的次數。陣列是排序的,所以重複出現的數字是相鄰排列的。用二分查詢演算法,找到第一次出現的位置,和 最後一次出現的位置。判斷第一次出現的位置條件為 當前數字的前乙個是否與之相等,若是則繼續查詢,否則該位置就是第一次出現的位置。判斷最後一次出現的位置條件為 當前數字的後乙個是...
面試題 數字在排序陣列中出現的次數
本體的思路 二分查詢 因為陣列有序 查詢數字 在陣列 中出現的次數 特殊 陣列為空 數字不出現在陣列中 數字出現在頭 尾 數字剛好為中間值 數字不為中間值 先對 返回 再判斷對 如果是首,則令last first,迴圈判斷list last 是否依舊等於a,相等則計數加 不等時,若last是第乙個不...