Markdown在线编辑器 - www.MdEditor.com
1.方法一:借助辅助数组存储k个最小的数
思想
存着最小k个数的数组,内部有序,遍历所有元素,和辅助数组中最大的比,只要小就替换辅助数组中的最大元素,然后再排序
代码
// 使用辅助数组来实现vector<int> FuZhu(vector<int> a,int k) {vector<int> result;if(a.size() < k || k == 0) return result;if (a.empty()) {return result;}result.push_back(a[0]);for (int i = 1; i < a.size(); i++) {if (result.size() == k) {sort(result.begin(), result.end());if (a[i] < *(result.end()-1)) {result.pop_back();result.push_back(a[i]);}} else {result.push_back(a[i]);}}//时间复杂度return result;}vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {return FuZhu(input, k);}
2.方法二:借助快速排序找到k的位置
思想
快速排序可以保证k左边的都小,右边都大,当基准元素位置==k个数时,输出前k个即可。
不用排两边,只要照着k在的那一侧即可
代码
intOnce(vector<int>&a,int start,intend){int mark = start;int tmp =0;for(int i = start +1; i <=end; i++){if(a[start]> a[i]){mark++;tmp = a[i];a[i]= a[mark];a[mark]= tmp;}}tmp = a[mark];a[mark]= a[start];a[start]= tmp;return mark;}void kuaisu(vector<int>&a,int k,int start,intend){int i =Once(a, start,end);if(k == i){return;}// 这次分完位置在i,和k去比较if(i > k){kuaisu(a, k,0, i -1);}else{kuaisu(a, k, i +1,end);}}// 借鉴快速排序实现vector<int>GetLeastNumbers_Solution(vector<int> input,int k){//找到k的位置就行vector<int> result;if(k > input.size())return result;// 找不到k位置if(input.empty()){return result;}// 让我们开始快速排序kuaisu(input, k,0, input.size()-1);// 把前k个数存入resultfor(int i =0; i < k; i++){result.push_back(input[i]);}return result;}