六、排序
-
剑指40,最小的k个数
//时间O(n),空间O(logn),此方法比使用快排快,空间为快排平均复杂度 //此题不能使用快排,因为面试时基本不让让你使用快排 //此方法基于快排但又不是快排,准确的说是部分快排,只对感兴趣的部分快排 //因此时间复杂度相较于快排更低,其思想是当哨兵的序号等于k时,哨兵左边即为最小k个数 //需要注意几点 //1.终止条件与快排不一样 //2.两个while(i<j)等号不要忘记,一个是<=,一个是>= //3.对于递归,不全递归,只选择感兴趣的进行递归,即包含k的段进行递归 class Solution { public: vector<int> getLeastNumbers(vector<int>& arr, int k) { //特殊情况 if(k == arr.size()) return arr; qsort(arr,0,arr.size()-1,k); return res; } private: vector<int> res; void qsort(vector<int> &vec,int left,int right,int k) { //只能是>而不能是>