题目链接:https://leetcode-cn.com/problems/smallest-k-lcci/
题意:计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
方法一: 利用快排思想,找到最小的前k个元素
class Solution {
private:
vector<int> quick_sort(vector<int>& arr, int k,int l,int r)//数组,k值,左侧坐标,右侧坐标
{
int i = l,j = r;//左右侧
while(i<j)
{
while(i<j&&arr[j]>=arr[l]) j--;//假如arr[j]大于被作为左侧基准的数,j就从右往左走
while(i<j&&arr[i]<=arr[l]) i++;//假如arr[i]小于被作为左侧基准的数,i就从左往右走
swap(arr[i],arr[j]);//更换对应的i,j将小于arr[l]的元素归位到左侧,大于的放到右侧
}
swap(arr[i],arr[l]);//更换最后一个arr[i]和arr[l],这个操作保证了原先的arr[l]变成了arr[i],这就保证了arr[l]左侧的元素都比他小,右侧的都比他大
if(i>k) return quick_sort(arr,k,l,i-1);//排序i左侧,大于左侧基准的值
if(i<k) return quick_sort(arr,k,i+1,r);//排序i右侧,小于右侧基准的值
return vector<int>(arr.begin(),arr.begin()+k);//返回前k个元素
}
public:
vector<int> smallestK(vector<int>& arr, int k) {
if(k>=arr.size()) return arr;//假如k大于arr的长度,返回arr数组
return quick_sort(arr,k,0,arr.size()-1);//进行快排,返回最小的k个数
}
};
方法二:先把所有元素排序,然后直接返回前k个
class Solution {
public:
vector<int> smallestK(vector<int>& arr, int k) {
sort(arr.begin(),arr.end());
return vector<int>(arr.begin(),arr.begin()+k);
}
};

本文探讨了LeetCode中的一个问题——找出数组中最小的k个数。提出了两种解决方案:一是利用快速排序的思路找到最小k个元素;二是通过先排序再提取前k个元素的方法。详细解析了每种方法的实现过程。
330

被折叠的 条评论
为什么被折叠?



