找出陣列中最小的k個數

2021-10-03 14:59:07 字數 1686 閱讀 5214

leetcode

面試題40. 最小的k個數

快速排序,時間複雜度為nlogn,然後前k個元素就是最小的k個數

class

solution

}

原理也是快速排序的原理,只不過增加了停止條件。不用完全排序而已。

class

solution

int label =

quicksort

(arr,

0, arr.length-1)

;while

(label != k)

else

}return arrays.

copyofrange

(arr,

0, k);}

//快速排序方法,輸入陣列,開始的序號,結束的序號,返回標籤的序號

//標籤左邊的元素都是小於等於flag的,標籤右邊的元素都是大於等於flag的。

public

intquicksort

(int

arr,

int begin,

int end)

while

(left < right && arr[left]

<= flag)

if(left < right)

} tmp = arr[begin]

; arr[begin]

= arr[left]

; arr[left]

= tmp;

return left;

}}

如果原始的資料不能修改的話,我們需要乙個容器,來儲存k個元素,遍歷陣列中的元素,如果比容器中最大的數要小的話,需要進入容器。

用乙個長度為k的陣列,當作乙個完全二叉樹,調整成大頂堆形式,遍歷陣列

class

solution

if(k >= arr.length)

int[

] contain = arrays.

copyofrange

(arr,

0, k)

;// 先調整成大頂堆形式。

for(

int pos = k /2-

1; pos >=

0; pos--

)for

(int i = k; i < arr.length; i++)}

return contain;

}// adjust方法,調整最大堆的完全二叉樹

// 輸入要調整的根節點的位置 pos,調整二叉數的整體長度。

public

void

adjusttree

(int

contain,

int pos,

int range)

int tmp = contain[pos]

;while

(pos *2+

1<= range)

if(contain[pos]

< contain[child]

)else}}

}

查詢陣列中最小k個數

思路 可採用大頂堆來實現 維護乙個規模為k的大頂堆。從前往後掃瞄陣列元素 若大頂堆的size小於k,則把當前元素插入大頂堆中 若小於k,若當前元素小於堆頂元素,則刪除堆頂元素,插入當前元素。考慮到從頭實現乙個大頂堆比較麻煩,這裡使用treeset容器,它提供有序的set。treeset底層實際使用的...

找出最小的k個數

已知陣列中的n個正數,找出其中最小的k個數。例如 4 5 1 6 2 7 3 8 k 4,則最小的4個數是1,2,3,4 要求 高效 分析時空效率 擴充套件 能否設計出適合在海量資料中實現上述運算?方法一 1 利用最大根堆實現最小k個節點2 最大根堆特點 每個節點都比他左右孩子要大3 調整最大堆的時...

無序陣列中最小的k個數

對於乙個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數,順序與原陣列中元素順序一致。給定乙個整數陣列a及它的大小n,同時給定k,請返回其中最小的k個數。測試樣例 1,2,4,3 4,2返回 1,2 簡單題 coding utf 8 class kthnumbers def findkt...