题解 | #最小的K个数#

最小的K个数

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

题目:最小的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;
    }
};



算法自然分析 文章被收录于专栏

在解决问题的同时,不断与人交流学习,通过牛客各式各样的题目,学习分享。

全部评论

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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