輸入n個整數,找出其中最小的k個數。
注意:
資料保證k一定小於等於輸入陣列的長度;
輸出陣列內元素請按從小到大順序排序;
樣例
輸入:[1,2,3,4,5,6,7,8] , k=4
輸出:[1,2,3,4]
思路1:
用大頂堆儲存k個數,然後不斷的遍歷陣列,若是陣列中的數小於堆頂元素,則替換。實踐複雜度為o(nlogk)。
acwing-53 c++ code:
class
solution;}
int n = input.
size()
; priority_queue<
int, vector<
int>
, less<
int>> k_nums;
for(
int i =
0; i < n; i++
)else
if(input[i]
< k_nums.
top())
} vector<
int> res;
while
(!k_nums.
empty()
)return res;}}
;
思路2:
快速排序的思想。平均時間複雜度為o(n)。
c++ code:
class
solution
swap
(nums[i]
, nums[j]);
while
(j > i && nums[i]
< midnum)
swap
(nums[i]
, nums[j]);
}if(k < j +1)
else
if(k > j +1)
} vector<
int>
getleastnumbers_solution
(vector<
int> nums,
int k);}
quicksort
(nums, k,
0, nums.
size()
-1);
vector<
int>
res(nums.
begin()
, nums.
begin()
+ k)
;sort
(res.
begin()
, res.
end())
;return res;}}
;
思路3:
先找出k個數,然後每遍歷一次剩下的數的時候,如果該數小於k個數中的最大值,就把這個最大值替換掉。時間複雜度為o(nk)。
c++ code:
class
solution
int max;
int index;
for(
int i =
0; i < input.
size()
; i++
) max = res[0]
; index =0;
for(
int i =
1; i < k; i++)}
if(max > input[i])}
sort
(res.
begin()
, res.
end())
;return res;}}
;
劍指offer40 最小的 K 個數
題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 方法一 維護乙個大小為k的大頂堆,複雜度 o nlogk o k 特別適合處理海量資料 public class solution priorityqueuemax...
劍指offer40 最小的k個數
問題描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,方法1 o nlogn def getleastnumbers input,k input.sort return input 4 a sorted input inpu...
劍指 Offer 40 最小的k個數
輸入整數陣列 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 輸入 arr 0,1,2,1 k 1 輸出 0 限制 0 k arr.length ...