輸入整數陣列 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]
限制:
分情況討論:1-》當陣列的大小較小,並行可以進行改變是,可以使用快速排序的方法,找對第k大的數,這個時候前面的k個數就是較小的k個數。
2-》當原陣列不可改變,且陣列非常大的時候,方法一不在適用,可以使用乙個堆來儲存前k個大小的數,實現動態比較儲存。
解法一(改變原陣列順序):
class solution else
}return vector(arr.begin(),arr.begin() + index+1);
}int partition(vector& nums,int low,int high)
nums[i] = pivot;
return i;
}};
可以使用乙個大小為k的大頂堆來存放k個數,當堆不滿的時候,直接放入;當堆滿時,將數與堆頂元素進行比較,如果來的數字比堆頂元素要小,刪除堆頂元素,插入新數,否則拋棄。
知識點:利用multiset實現堆排序,multiset erase函式,insert函式的使用
解法二(利用stl中multiset使用紅黑樹實現的性質 實現大頂堆)
class solution
}return vector(result.begin(),result.end());
}};
40 最小的K個數
輸入n個整數,找出其中最小的k個數。例如,輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4.通過快速排序,每次確定基準資料的位置,根據快速排序的特性,位置左側的資料均小於基準資料,位置右側的資料均大於資料,直至該位置等於k 1時,左邊的資料恰好是最小的k個數。如下 pu...
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 class solution que...
第40題 最小的K個數
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,法1,std sort。快排onlogn class solution return ret 法2.partiton on include using namespace std ...