每列大於0的個數 28 最小的K個數

2021-10-16 03:37:16 字數 824 閱讀 9494

題目描述

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

解題思路一:這道題我們最直接的想法就是將這些數按照公升序排序,然後取前k個數,就是我們最終想要的到的結果,現在較好一點的排序方法時間複雜度是nlogn,我們還有更快的實現方法嗎?

方法二:o(n)的演算法。思路是利用快排的思想,以最後乙個元素為基準,將陣列一分為二,左邊小於基準,右邊大於基準,完成一趟分割,基準的下標為index,這時,包括基準在內,左邊有index+1個最小元素,若index+1=k,顯然符合題意,直接將這index+1個元素輸出即可,若不等於:

1.index>k-1,則前k個元素的右端點應該在基準的左邊,所以更新查詢範圍的右端點,重新在左側找;

缺點是會改變輸入陣列。

使用快排的思想找下標index的過程,最後找到的index所在位置也是數中第k大的數,所以找陣列中任意第k大的數的時間複雜度亦為o(n)。

方法三:不改變輸入陣列,使用最大堆。

每列大於0的個數 OpenCV檢測手指個數

我們先來看餘弦定理,它是檢測手指個數的根本原理。下面是乙個三角形 餘弦定理表述為,對於任意三角形,任何一邊的平方等於其他兩邊平方的和減去這兩邊與它們夾角的余弦的積的兩倍。用數學公式可以如下圖表示 opencv count fingers 對應到本文的手指檢測,我們手指之間其實也有乙個三角形,因此利用...

每k個數的最大最小值 (單調佇列)

有n個數,每次向右移動一位,每k個數輸出最大值最小值。題目鏈結 單調佇列,求最大值的時候佇列裡儲存下降序列的下標,求最小值的時候,儲存上公升序列的下標。每次輸出隊首。如果佇列裡的數的個數多於k個,就彈出隊首。pragma warning disable 4996 include include in...

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...