劍指Offer 最小的k個數

2021-10-03 19:58:04 字數 1925 閱讀 8824

演算法1 排序取k個最小值

演算法2 快速選擇

演算法3 堆排序

輸入n個整數,找出其中最小的k個數

注意:

樣例

輸入:[1,

2,3,

4,5,

6,7,

8], k=

4輸出:[1,

2,3,

4]

std::sort排序後取最小的k個數。

時空分析

時間複雜度分析:sort的時間複雜度o(nlogn), 遍歷k次o(k), 總的時間複雜度o(nlogn)

c++ **

class

solution

return res;}}

;

自寫排序演算法:

class

solution

return res;

}void

quick_sort

(vector<

int>

& a,

int l,

int r)

quick_sort

(a, l, j)

;quick_sort

(a, j+

1, r);}

};

運用快速排序的思想,每次快速選擇會將乙個數放置到正確的位置(即滿足左邊的數都比它小,右邊的數都比它大),因此我們可以對原陣列做k次快速選擇。

時空分析

時間複雜度分析:與quick sort不同的是,quick select只考慮所尋找的目標所在的那一部分子陣列,而非像quick sort一樣分別再對兩邊進行分割。正是因為如此,quick select將平均時間複雜度從o(nlogn)降到了o(n)

最壞時間複雜度:о(n²)

平均時間複雜度:о(n)

最壞空間複雜度: totalо(n), auxiliaryo(1)

c++**

class

solution

intquick_select

(vector<

int>

& q,

int l,

int r,

int k)

if(k == j-l+1)

return q[j]

;else

if(k < j-l+1)

return

quick_select

(q,l,j,k)

;else

return

quick_select

(q,j+

1,r,k-

(j-l+1)

);}}

;

維護乙個大小為k的大根堆,將陣列元素都push進堆,當堆中的數大於k時彈出堆頂元素。注意彈出堆頂的順序是從大到小的k個數,要進行逆序操作

時空分析

時間複雜度分析:建堆的時間複雜度是o(logk),要進行n次建堆的操作。總的時間複雜度為o(nlogk)

c++ **

class

solution

while

(heap.

size()

)reverse

(res.

begin()

,res.

end())

;return res;}}

;

劍指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。附 這只是乙個比較簡單的方法。如果考慮...