返回最小的k个数

对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致。

给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。

测试样例:

[1,2,4,3],4,2
返回:[1,2]

1、排序

2、找到k大作为基准

3、遍历比较,小于k的输出

vector<int> findKthNumbers(vector<int> A, int n, int k) {
        vector<int> B = A;
        vector<int> ans;
        sort(B.begin(),B.end());
        for(int i=0;i<A.size();i++)
            if(A[i] <= B[k-1])
              ans.push_back(A[i]);
        return ans;
    }

  

时间: 2024-10-05 20:24:59

返回最小的k个数的相关文章

找出最小的k个数

•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中实现上述运算? 方法一: 1 //利用最大根堆实现最小k个节点 2 //最大根堆特点:每个节点都比他左右孩子要大 3 //调整最大堆的时间复杂度为O(lnK),因此该算法(问题)时间复杂度为O(nlnK). 4 //思路:通过数组建堆 5 //规律:第i个节点的左孩子为2i+1,右孩子为2i+2 6

【面试题030】最小的k个数

[面试题030]最小的k个数 题目: 输入n个整数,找出其中最小的k个数. 例如输入4.5.1.6.2.7.3.8这8个字,则其中最小的4个数字是1.2.3.4. 思路一: 可以同样的基于随机快速排序的Partition函数,来对数组做划分, 基于k来作调整,返回调用Partition函数,直到左边的k个数字是整个数组中最小的k个数字. ps.这种方法要修改数组中数字的顺序,因为Partition函数会调整数组中数字的顺序. 12345678910111213141516171819202122

寻找最小的K个数

寻找最小的K个数 题目描述:查找最小的K个数 题目:输入n个整数,输出其中最小的K个数 例如,输入1.2.3.4.5.6.7.8这8个数字,则最小的4个数字为1.2.3.4. 第一节.各种思路,各种选择 要求一个序列中最小的K个数,按照惯有的思维方式,很简单,先对这个序列从小到大排序,然后输出前面的最小的K个数即可: 至于选取什么样的排序方法,第一时间应该想到的是快速排序,我们知道,快速排序平均时间复杂度为O(nlogn),然后再遍历序列中前K个元素输出,即可,总的时间复杂度为O(nlogn +

【剑指Offer】最小的K个数

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4, 直接使用sort排序,然后返回前k个数: class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { sort(input.begin(), input.end()); vector<int> r; if(k>inp

寻找最小的k个数(update)

类似编程之美中寻找最大的k个数 解法一: 题目没有要求最小的k个数有序,也没要求最后n-k个数有序.既然如此,就没有必要对所有元素进行排序.这时,咱们想到了用选择或交换排序,即: 1.遍历n个数,把最先遍历到的k个数存入到大小为k的数组中,假设它们即是最小的k个数: 2.对这k个数,利用选择或交换排序找到这k个元素中的最大值kmax(找最大值需要遍历这k个数,时间复杂度为 O(k) ): 3.继续遍历剩余n-k个数.假设每一次遍历到的新的元素的值为x,把x与kmax比较:如果 x < kmax

剑指offer(29)最小的K个数

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目分析 这题有两种方法来做. 第一种就是基于partition的方法,详见我的另一篇文章:基于快排思想查找第K大的数或第K小的数. 第二种就是利用一个长度为k的额外容器,来存储最小的K个数字.容器未满则填满,再添加数字是,将数字和容器的最大值比较,小的话就替换,大的话舍去. 这个容器要求可以直接得到最大值.能删除最大值,能添加值.那么很容易想到应该用最大堆当这个

剑指offer(二十三,二十四,二十五)最小的k个数,连续子数组的最大和,链表中环的入口节点

23:最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 简单题.... function GetLeastNumbers_Solution(input, k) { if(k>input.length) return []; let ans = []; input = input.sort(); //console.log(input.join("").slice(0,4).split

最小的K个数 C++(BFPRT,堆排序)

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. //堆排序 #include <iostream> #include <algorithm> #include <vector> using namespace std; class Solution { public: void HeapAdjust(vector<int> &a,int s,int n) { int

python剑指offer最小的K个数

题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定partition函数的哨兵为key=lists[left],在partition函数中完成一轮比较的结果是,比key大的数都在其右边,比key小的数放在其左边.完成该轮后返回其left=right时left的值. ②我们判断left的值是比k大还是小: 如果left的值比k大,说明上轮partition之