劍指Offer 最小的k個數

2021-09-13 19:14:02 字數 1066 閱讀 6760

本題在《劍指offer》中提供了兩種解題思路,分別是使用快速排序和使用紅黑樹,下面分別討論:由於我們使用快速排序可以得到第n個位置的數字,並且n左邊的數字比n小,n右邊的數字比n大,那麼如果n=k+1,則將n左邊的數字返回即可,這裡返回的k個數字沒有排序,會改變輸入的陣列,時間複雜度為o(n),**如下:

class solution }}

small++

;swap

(input[small]

, input[end]);

return small;

} vector<

int>

getresult

(vector<

int>

&input,

int start,

int end)

else

}for

(int i =

0; i < kk; i++

)return v;

} vector<

int>

getleastnumbers_solution

(vector<

int> input,

int k)

};

具體思路為,首先建立乙個容器,該容器大小為k,然後遍歷整個陣列,如果容器沒滿,則新增進去乙個數字,如果容器滿了,則用容器裡的最大的數字和該遍歷的陣列中的數字x比較,如果x大於這個容器中最大的值,則說明x不是最小的k個數字,否則如果x小於容器中的最大值,把容器中的最大值去掉,新增進x值。容易想到的是使用最大堆,或者紅黑樹。這裡用multiset儲存,因為它本身就是基於紅黑樹實現的。**如下:
class solution 

else}}

for(multiset<

int, greater<

int>

>

::iterator iter = sets.

begin()

; iter != sets.

end(

); iter++

)return result;}}

;

劍指offer 最小k個數

1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...

劍指offer 最小的K個數

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...

《劍指offer》最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入給整數陣列,和k 找出其中最小的k個數 class solution 1 先用插入排序對陣列中數進行排序。2 取出有序陣列中最小的kge。附 這只是乙個比較簡單的方法。如果考慮...