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

2021-06-26 04:53:51 字數 1486 閱讀 4676

見劍指offer——面試題30

set/multiset相關知識

set是stl中一種標準關聯容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是標準關聯容器),它底層使用平衡的搜尋樹——紅黑樹實現,插入刪除操作時僅僅需要指標操作節點即可完成,不涉及到記憶體移動和拷貝,所以效率比較高。set,顧名思義是「集合」的意思,在set中元素都是唯一的,而且預設情況下會對元素自動進行公升序排列,支援集合的交(set_intersection),差(set_difference) 並(set_union),對稱差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允許重複那麼可以使用multiset.

重要知識點

1)multiset預設是按遞增順序排列的,要按遞減順序排可以這樣

multiset> intset;

2)multiset的迭代器

typedef multiset>::iterator setiterator;

遍歷元素的過程是:

for(setiterator it=myset.begin();it!=myset.end();++it)

cout<

3)訪問操作

第乙個元素:setiterator first=leastnumbers.begin();

插入元素:intset.insert(var);

刪除元素:inset.erase(first);

實現原始碼:

#include#includeusing namespace std;

typedef multiset> intset;

typedef multiset>::iterator setiterator;

void getleastnumbers(int *input,int n,intset &leastnumbers,int k)

{ leastnumbers.clear();

if(k<1||n>k;

getleastnumbers(input,9,myset,k);

for(setiterator it=myset.begin();it!=myset.end();++it)

cout<

cout<

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