輸入整數數組 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 {
public:
//調整位置函數,讓下標爲low的元素找到自己的位置
void downAdjust(int low,int high,vector<int>& arr){
int i = low;
int j = i*2+1;
while(j<high){
if(j+1<high&&arr[j]<arr[j+1]){
++j;
}
if(arr[i]<arr[j]){
swap(arr[i],arr[j]);
i = j;
j = i*2+1; //注意下標是從0開始的,所以左孩子爲i*2+1,右孩子爲i*2+2
}
else break;
}
}
//建堆
void createHeap(vector<int>&arr){
int size = arr.size();
for(int i = size/2;i>=0;i--){
downAdjust(i,size-1,arr);
}
}
//堆排序
void heapSort(vector<int>&arr){
createHeap(arr);
for(int i = arr.size()-1;i>=0;i--){
swap(arr[0],arr[i]);
downAdjust(0,i,arr);
}
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
heapSort(arr);
vector<int> res;
if(arr.size()==0)return res;
for(int i = 0;i<k;i++){
res.push_back(arr[i]);
}
return res;
}
};