思路
最好写的办法自然是先qsort,然后取第k个元素,但这样把另外n-k个无关的元素也排了序。这题仍然使用升序快排的模板,但是当找到的pivot
枢纽元比k
大的时候只排它左边的子数组。
另外这题给出的k可能比数组size还大,需要单独处理,代码如下:
class Solution { public: //快排的模板 void qsortk(int l, int r, vector<int> &a, int k) { if(l < r) { int i = l, j = r; int pivot = a[l]; while(i < j) { while(i < j && a[j] >= pivot) j--; if(i < j) a[i] = a[j]; while(i < j && a[i] <= pivot) i++; if(i < j) a[j] = a[i]; } a[i] = pivot; if(j < k) { qsortk(l, j-1, a, k); qsortk(j+1, r, a, k); } else { qsortk(l, j -1, a, k); } } } vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int size = input.size(); qsortk(0, size-1, input, k); vector<int> res; if(k > size) return res; res.resize(k); for(int i = 0; i < k; i++) { res[i] = input[i]; } return res; } };