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