1-題目
:
輸入n個整數,輸出其中最小的k個。
2-示例
:
輸入1,2,3,4,5,6,7,8
八個數,則最小的4個數為1,2,3,4
。
3-思路
:
3.1
-最簡單的思路就是將n個數排序
,然後取出最小的k個數,但是這樣的時間複雜度為o(n*logn)。
3.2
-我們嘗試更快的思路。可以開闢乙個長度為k的陣列karr
,每次讀入乙個數,如果karr元素個數少於k個,則直接放入karr中;如果karr已經滿了,此時若讀入的數比karr中最大的數小,則替換該數。這樣karr裡維持的永遠是最小的k個數,時間複雜度為o(n+n*logk)。通常情況下k要遠小於n,所以這種辦法要優於前面的思路。
3.2注
-當karr已經滿了之後,如果需要替換,每次替換的都是陣列中的最大值。在常用的資料結構中,能夠在o(1)時間
裡得到最大值的資料結構為最大堆,因此我們可以用堆(heap)來代替陣列
。
4-**
:
#include #include #include using namespace std;
typename multiset> intheap;
void findleastnumbers(const vector&data, intheap &leastnumbers, unsigned int k)
vector::const_iterator iter = data.begin();
for (; iter != data.end(); iter++)
else}}
}
程式設計師面試一百題 15 含有指標成員的類的拷貝
1 題目 下面是乙個陣列類的宣告與實現 請分析這個類有什麼問題,並針對存在的問題提出幾種解決方案。有問題的 template class arr arr void setvalue unsigned index,const t value t getvalue unsigned index cons...
程式設計師面試一百題 17 把字串轉換為整數
1 題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。2 示例 輸入 345 輸出345。3 思路 題目並不難,但是很好能考察程式設計師的思維能力,因為很多程式設計細節需要考慮,例如正負數的判斷 首字母是否為0 空指標的處理 非法輸入的判斷等等。4 true表示輸入有效,false表示輸入非法...
程式設計師面試攻略題2
題目 刪除單向鍊錶的頭元素的函式。請找出其中的程式漏洞並加以糾正 void removehead node head 分析 在c語言裡,輸入引數都是以值傳遞的方式進入子函式的,換句話說,子函式所使用的 是輸入引數的乙個區域性副本,對這個區域性副本的修改不可能在該函式以外的地方被 看到 但在c語言裡,...