輸入整數陣列 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...