剑指offer29_topK问题快排方式解决

 

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

class Solution {
public:
    vector GetLeastNumbers_Solution(vector input, int k) {
        vector res;
        if(input.size()<=0) return res;
        int index=topk(input,0,input.size()-1,k);
        for(int i=0;i<=index;i++){//记得带上等号
            res.push_back(input[i]);
        }
        return res;
    }
    int partion(vector &a,int left,int right){//快排的partition函数
        int temp=a[left];
        while(lefttemp) right--;
            a[left]=a[right];
            while(left &a,int left, int right, int k){//寻找topk的位置
        int index = -1;
        if(left <= right){//考虑特殊情况带上等号
            int pos = partion(a,left,right);
            int len = pos-left+1;
            if(len == k)
                index = pos;
            else if (len < k){
                index = topk(a,pos+1,right,k-len);
            }else {
                index = topk(a,left,pos-1,k);
            }
        }
        return index;
    }
};

 

你可能感兴趣的:(C++/PAT/洛谷OJ)