题解 | #最小的K个数#

最小的K个数

http://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

快排思想
class Solution {
public:
    int partition(vector<int> &a, int left, int right){
        int first = a[left];
        while(left < right){
            while(left < right && first <= a[right]){
                right --;
            }
            if(first > a[right]){
                a[left++] = a[right];
            }
            while(left <right && a[left] <= first){
                left ++;
            }
            if(a[left] > first){
                a[right--] = a[left];
            }
        }
        a[left] = first;
        return left;
    }

    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> res;
        if(k == 0 || k > input.size()){
            return res;
        }
        int left = 0, right = input.size()-1;
        while(left < right){
            int pos = partition(input, left, right);
            if(pos == k-1){
                break;
            }else if(pos < k-1){
                left = pos + 1;
            }else{
                right = pos - 1;
            }
        }
        for(int i=0; i<k; i++){
            res.push_back(input[i]);
        }
        return res;
    }
};
犯过两个错误:
1. 代码如下:
    void quickSort(vector<int> &a, int left, int right, int k){
        if(left >= right) return;
        int pos = partition(a, left, right);
        if (pos == k-1) return;
        else if (pos > k-1) quickSort(a, left, pos-1, k);
        else {
                   quickSort(a, left, pos-1, k);   
	
          quickSort(a, pos+1, right, k);
        }
    }
错误在于:如果pos落在k后,其前面的部分并不需要排序,如果代码这样写,实际运行时,一开始落在k右侧的pos在后面几轮是pos也会出现在k左侧。
为了避免这种情况,这里不应当将k带入递归当中

另外,可以化简res的输出:
if(pos == k-1){
    return vector<int> ({input.begin(), input.begin()+k});
}




全部评论

相关推荐

少年郎as:这不把公司名贴出来那我可要喷你了哦
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务