题目:最小的K个数

描述:给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组

示例1:输入:[4,5,1,6,2,7,3,8],4,返回值:[1,2,3,4]

 

解法一:

解题思路:乍一看,这种题目相对来说比较简单,在思考的时候,可以想一种比较简单的算法,因为想要找到数组中最小的k个数,可以直接调用C++里边的sort()函数,将数组中的元素,按照从小到大的顺序进行排序,排序好以后,新建一个容器对象:res,整一个for循环,将排序好的原数组里边的数字按0-k直接输出,将所有输出的数字push_back到res容器里边,然后直接将res输出即可。

在笔者进行程序验证的时候,疏忽了一点,就是关于K >数组的长度,那么返回一个空的数组,这种直接添加一个if语句判断即可完成相应操作。

实例分析:[4,5,1,6,2,7,3,8],4

在这个数组中,要寻找最小的4个数的值,首先建立一个新的容器对象res,方便以后进行判断。

4

5

1

6

2

7

3

8

使用sort函数,将数组元素进行排序

1

2

3

4

5

6

7

8

将较小的4个数放入res容器当中即可

1

2

3

4

 

 

 

 

 

具体C++代码如下所示:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int len = input.size();
        vector<int> res;
        if(len < k)
            return res;
        sort(input.begin(), input.end());
        for(int i = 0; i < k ;i++){
            res.push_back(input[i]);
        }
        return res;
    }
};

其时间复杂度为O(n*logn)。

解法二:

思路分析:因为本题只需要前k个数,所以也可以采用部分选择排序法进行排序,只需要通过K次排序找到K个最小的数即可。

C++代码如下所示:
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int sz = input.size();
        vector<int> vec;
        if (sz == 0 || k <= 0 || sz < k)
            return vec;
        for (int i = 0; i < k; ++i)
        {
            for (int j = i + 1; j < sz; ++j)
            {
                if (input[i] > input[j])
                    swap(input[i], input[j]);
            }
            vec.push_back(input[i]);
        }
        return vec;
    }
};