2-剑指offer: 最小的K个数

时间:2023-03-09 04:51:16
2-剑指offer: 最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

代码:

// 这种topN问题比较常见的是使用堆来解决,最小的k个数就采用最大堆,最大的k个数就采用最小堆.
// 此外任然可以用快排来解决. class Solution {
public:
int Partition(vector<int> &input, int left, int right) {
if (left > right)
return left;
int key = input[left];
int i = left;
int j = right;
while(i<j) {
// 从右往左遍历
while (i < j && input[j] >= key) {
j--;
} // 交换
if (i < j) {
input[i] = input[j];
i++;
} // 从左往右遍历
while(i<j && input[i] <= key) {
i++;
} // 交换
if (i<j) {
input[j] = input[i];
j--;
}
}
input[i] = key;
return i;
} void QuickSort(vector<int> &input, int k, int left, int right) {
if (left >= right) return;
int mid = Partition(input, left, right);
if (mid == k-1) return;
else if(mid > k-1) QuickSort(input, k, left, mid-1);
else if (mid < k-1) QuickSort(input, k, mid+1, right);
} vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if ((size_t)k > input.size())
return res;
else{
QuickSort(input, k, 0, input.size()-1);
res.insert(res.end(), input.begin(), input.begin()+k);
}
return res;
}
};

只是快排是能够解决这个问题的,不过这里对快排进行了一点更改,减小了时间复杂度.