《劍指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個數,即某一次快...