最小的K个数(C++)

题目:

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

思路:

1. 使用Partition函数,当其返回的index为k-1时,前k位即最小的k个数字,时间复杂度为O(n),但是会修改原始数组

代码如下:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> result;
        int len = input.size();
        if(len < 1 || k > len || k <= 0)
            return result;
        int start = 0;
        int end = len - 1;
        int index = Partition(input, len, start, end);
        while(index != k - 1)
        {
            if(index < (k - 1))
            {
                start = index + 1;
                index = Partition(input, len, start, end);
            }
            else
            {
                end = index - 1;
                index = Partition(input, len, start, end);
            }
        }
        for (int i = 0; i < k; i++)
            result.push_back(input[i]);
        return result;
    }
    /*---------Partition函数返回的位置之前的元素都小于该位置元素----------*/
    int Partition(vector<int> &input, int len, int start, int end)
    {
        int index = RandomInRange(start, end);
        swap(input[index], input[end]);
        int small = start - 1;
        for(index = start; index < end; index++)
        {
            if(input[index] < input[end])
            {
                small++;
                if(small != index)
                    swap(input[index], input[small]);
            }
        }
        ++small;
        swap(input[small], input[end]);
        return small;
    }
    /*-------生成start到end之间的随机数---------*/
    int RandomInRange(int start, int end)
    {
        int i = rand() % (end - start + 1) + start;
        return i;
    }
};
发布了63 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Jerry_Leo_liu/article/details/105058618