題解三十四

2021-10-23 07:20:49 字數 2039 閱讀 4186

輸入整數陣列 arr ,找出其中最小的 k 個數。例如,輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。

示例 1:

輸入:arr = [3,2,1], k = 2

輸出:[1,2] 或者 [2,1]

示例 2:

思路:我們可以使用乙個大小為 k 的大頂堆,將陣列中的元素依次入堆,當堆的大小超過 k 時,便將多出的元素從堆頂彈出。這樣,由於每次從堆頂彈出的數都是堆中最大的,最小的 k 個元素一定會留在堆裡。

我們可以使用庫函式中的優先佇列資料結構 priorityqueue(預設是小頂堆)。

當堆為空或堆的大小小於k,往堆裡新增元素,如果當前數字不小於堆頂元素,數字可以直接丟掉,不入堆。

如果堆的大小超過k了,則poll掉堆頂元素。

class

solution

/// 預設是小頂堆,實現大頂堆需要重寫一下比較器

queue

heap =

newpriorityqueue

<

>

((v1, v2)

-> v2 - v1)

;for

(int num : arr)

if(heap.

size()

> k)

}//返回堆中元素

int[

] res =

newint

[heap.

size()

];int n =0;

for(

int min : heap)

return res;

}}

思路:快速排序

我們需要進行partition操作,從陣列中隨機選取乙個樞紐元素 v,然後原地移動陣列中的元素,使得比 v 小的元素在 v 的左邊,比 v 大的元素在 v 的右邊。接下來,快速排序會遞迴地排序左右兩側的陣列。

假設經過一次 partition 操作,樞紐元素位於下標 m,也就是說,左側的陣列有 m 個元素,是原陣列中最小的 m個數。有以下幾種情況:

(1)k == m ,我們就找到了最小的 m個數,就是左側的陣列;

(2)k < m, 則最小的 m個數一定都在左側陣列中,我們只需要對左側陣列遞迴地 partition 即可;

(3)k > m, 則左側陣列中的 m個數都屬於最小的 k個數,我們還需要在右側陣列中尋找最小的 k - m個數,對右側陣列遞迴地 partition 即可。

class

solution

else

if(arr.length <= k)

quickselect

(arr,

0, arr.length -

1, k)

;int

res =

newint

[k];

for(

int i =

0; i < k; i++

)return res;

}public

void

quickselect

(int

arr,

int lo,

int hi,

int k)

else

if(k < m)

else

}public

intpartition

(int

nums,

int lo,

int hi)

}while

(nums[

--j]

> v)}if

(i >= j)

swap

(nums, i, j);}

swap

(nums, lo, j)

;return j;

}public

void

swap

(int

nums,

int i,

int j)

}

GNU make manual 翻譯 三十四

繼續翻譯 a directive is an instruction for make to do something special while reading the makefile.these include reading another makefile note including o...

CUDA學習(三十四)

c語言擴充套件 函式執行空間說明符 函式執行空間說明符表示函式是在主機上還是在裝置上執行,以及函式是從主機還是從裝置中呼叫。device device 執行空間說明符宣告乙個函式 global 和 device 執行空間說明符不能一起使用。global 空間說明符將乙個函式宣告為乙個核心。這樣的功能...

GNU make manual 翻譯 三十四

繼續翻譯 複製 a directive is an instruction for make to do something special while reading the makefile.these include reading another makefile note includin...