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...