JZ29 最小的K個數

2021-10-10 14:22:35 字數 1906 閱讀 3752

輸入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_queue

type 就是資料型別,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,...