书上有2种解法
参考题解,觉得快速排序和学习使用multiset挺不错的,实现了这两种解法,还有就是后面会在这道题下面更新一波十大排序算法的实现
解法01:
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
// way01 可以修改数组 选择排序算法
vector<int> minK;
multiset<int, less<int>> Kminnum; // 利用multiset实现最大堆和最小堆
// 考虑边界条件
if(arr.empty() || k <= 0)
return minK;
//此方法效率很低 时间复杂度为O(N+k)
for(int i = 0; i < arr.size(); i++){
Kminnum.insert(arr[i]);
}
int j = 0;
for(auto v: Kminnum){
if(j == k){
break;
}
minK.push_back(v);
j++;
}
return minK;
}
};
解法02:
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
// way02 快速排序算法
vector<int> minK3;
if(arr.empty() || k <= 0)
return minK3;
quicksort(0, arr.size()-1, arr);
minK3.assign(arr.begin(), arr.begin() + k); //此处非常精彩 学习vector的用法
return minK3;
private:
//快速排序算法
void quicksort(int left, int right, vector<int>& arr){
if(left >= right){
return; // 一轮排序结束标志
}
int i, j, basenum, temp;
i = left;
j = right;
basenum = arr[left];
while(i < j){
while(arr[j] >= basenum && i < j){
j--;
}
while(arr[i] <= basenum && i < j){
i++;
}
if(i < j){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[left] = arr[i];
arr[i] = basenum; // 重新确定基准值
quicksort(left, i-1, arr);
quicksort(i+1, right, arr);
}
};