輸入n個整數,找出其中最小的k個數。
示例1:輸入
輸出[4,5,1,6,2,7,3,8],4
[1,2,3,4]
【解法】
1.排序
//思路十分簡單:排序+輸出前k個數
class
solution);
}};
2.堆排序
c++優先佇列(priority_queue)用法詳解
普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。
在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出 (first in, largest out)的行為特徵。
優先佇列具有佇列的所有特性,包括佇列的基本操作,只是在這基礎上新增了內部的乙個排序,它本質是乙個堆實現的。
和佇列基本操作相同:
定義:priority_queuetype 就是資料型別,container 就是容器型別(container必須是用陣列實現的容器,比如vector,deque等等,但不能用 list。stl裡面預設用的是vector),functional 就是比較的方式。
當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,預設是大頂堆。
一般是:
//公升序佇列,小頂堆
priority_queue
,greater
> q;
//降序佇列,大頂堆
priority_queue
,less
>q;
//greater和less是std實現的兩個仿函式(就是使乙個類的使用看上去像乙個函式。其實現就是類中實現乙個operator(),這個類就有了類似函式的行為,就是乙個仿函式類了)
//建立乙個容量為k的大頂堆的優先佇列。
//遍歷一遍元素,如果佇列大小//否則,讓當前元素與隊頂元素相比,如果隊頂元素大,則出隊,將當前元素入隊
class
solution
else}}
while
(!pq.
empty()
)return ret;}}
;
3.快排思想
對陣列[l, r]一次快排partition過程可得到,[l, p), p, [p+1, r)三個區間,[l,p)為小於等於p的值
[p+1,r)為大於等於p的值。
然後再判斷p,利用二分法
1.如果[l,p), p,也就是p+1個元素(因為下標從0開始),如果p+1 == k, 找到答案
2.如果p+1 < k, 說明答案在[p+1, r)區間內,
2.如果p+1 > k , 說明答案在[l, p)內
class
solution
}swap
(input[i]
, input[r-1]
);return i;
} vector<
int>
getleastnumbers_solution
(vector<
int> input,
int k));
}if(p+1
< k)
else
}return ret;}}
;
29 最小的K個數
題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。總結 先從小到大排序,再取出前四個。一 全排序時間複雜度o nlogn class solution for int j k 1 j 0 j if result k 1 ...
劍指Offer (29)最小的k個數
題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。實現如下 測試用例中給出的返回值是有序的。嘖嘖。找到序列中最小的k個數,利用set,對數字進行insert或erase 紅黑樹中查詢 插入 刪除操作都為 o logk 最...
劍指offer 29 最小的K個數
題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路分析 簡單思路 先快排,再取數 coding utf 8 class solution def getleastnumbers solution self,tinput,...