《劍指offer》面試題30 最小的k 個數

2021-08-20 06:55:47 字數 1490 閱讀 3915

《劍指offer》面試題30——最小的k 個數

#1.題目描述:

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

#2.解題思路:

1。全排序。時間複雜度o(nlogn)。

2。partiton思想 ——用快速排序,時間複雜度o(n) 。

3。最大堆 時間複雜度o(nlogk)

4。紅黑樹:multiset集合。

#3.**實現:

###3.1.方法1**

#include#include#include using namespace std;

vectorgetleastnumbers_solution(vectorinput, int k)

;print1dvec(vec);

vectorvec2=getleastnumbers_solution(vec ,4);

print1dvec(vec2);

return 0;

}

執行結果:

1  5  1  1  1  7  1  8

1 1 1 1

process returned 0 (0x0) execution time : 0.429 s

press any key to continue

方案4**:

//multiset

//當容器中的元素數量不夠k 個時,直接放入容器中

//當容器中的元素數量滿k個時,,把當前陣列中的元素與容器中的最大的元素比較。

//如果當前元素值小於容器中的最大值,則將容器中的最大值替換為當前值。

#include#include #includeusing namespace std;

//typedef multiset> intset;

//typedef multiset>::iterator setiter;

vectorgetleastnumbers_solution(vectorinput, int k)}}

return vector(leastnumber.begin(),leastnumber.end());

}void print1dvec(vectormyarray)

; print1dvec(vec);

vectorvec2=getleastnumbers_solution(vec ,4);

print1dvec(vec2);

return 0;

}

執行結果:

1  5  1  1  1  7  1  8

1 1 1 1

process returned 0 (0x0) execution time : 0.446 s

press any key to continue.

劍指offer 面試題30 最小的K個數

題目 輸入n個數,找出其中最小的k個數。例如輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1,2,3,4。思路 這道題目是典型的top k問題。兩種方法 1 如果允許改變量列,半快速排序,是基準值正好為第k個數,那麼基準值左邊的都是小於它的,即可得到最小的k個數 求最大的過程類似 ...

劍指offer 面試題30 最小的k個數

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4.題目分析 這道題最簡單的思路莫過於把n個整數排序,然後最前面的k個數就是最小的k個數,但是時間複雜度是o nlogn 我們應該想一想有沒有更快的方法。解法一 o n 的演...

劍指Offer 面試題30 最小的k個數

題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 1 首先,使用快排中的思路 每進行一次快排,會確定乙個位置上的數字,使得該位置前的數字都小於該數字,而該位置後的數字都大於該數字。2 所以,要找最小的k個數,即某一次快...