【刷题之路】最小的K个数

原创 2016年07月29日 17:59:48

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

最优方法可以做到n*log(k)。做法就是使用堆排序,只维护一个规模为k的大根堆,之后遍历所有的数字,一旦后面数字比堆顶小,则交换两数,并重新调整大根堆,遍历完成后堆中元素就是最小的k个数(但是这K个数不一定是排序的)

代码如下:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k){
        int i,j=0;
        vector<int> res;
        int n=input.size();
        if(n<k) return res; //如果K比总数还大,直接返回
        maxheap(input,k); //由前K个数建立一个大根堆
        for(i=k;i<n;i++){
            if(input[0]>input[i]) swap(input[0],input[i]);  //之后的数字只要比堆顶大,则改变堆顶,并调整K规模的大根堆
            fixdown(input,0,k);
        }
        for(i=0;i<k;i++) res.push_back(input[i]); //遍历完成后,输出前K个即为最小的K个数
        return res;
        
    }
    void maxheap(vector<int> &num,int n){
        int i;
        for(i=n/2-1;i>=0;i--){
            fixdown(num,i,n-1);
        }
    }
    void fixdown(vector<int> &num, int i,int n){ //这里的n是下标,所以之前的fixdown要是n-1
        int j;
        int flag=1;
        while(2*i+1<n && flag){  //常规堆排序做法,不详述
            if(2*i+2>=n) j=2*i+1;
            else{
                if(num[2*i+2]<num[2*i+1]) j=2*i+1;
                else j=2*i+2;
            }
            if(num[i]<num[j]){
                swap(num[i],num[j]);
                i=j;
            }
            else flag=0;
        }
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

最小的k个数 剑指office原题

输入n个整数,找出其中最小的K个数 2016-07-06 14:10:51 问题:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2...

面试题30:最小的k个数(未)

面试题30:最小的k个数题目描述: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题目分析: 找出最小的k个数,直观的解...

n 个数中最小的 k 个数

1. 描述 输入 n 个整数,输出其中最小的 k 个。 2. 解法 一般的方法是用选择排序,直到k个最小的数产生。时间复杂度为O(nk),空间复杂度为O(n)。 或者是对这n个数用...

最小的K个数 (冒泡和最小堆)

问题:最小的K个数 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 - 方法一(冒泡排序k趟) 思路:冒泡排...
  • hyqsong
  • hyqsong
  • 2015年10月31日 08:54
  • 290

查找n个数中最小的k个元素

/* 求n个数中最小的k个元素 * 用堆排序:时间复杂度为O(nlgk) */ #include /* 求左右叶子、父结点的宏定义 */ #define LEFT(i) ((i) * 2) ...

剑指offer-----面试题30(最小的k个数)

实现思路:         实现思路类似于上一题的求解数组中出现次数超过一半的数字,这道题同样也并没有要求我们将最小的k个数按顺序输出来,因此我们可以借助于快速排序寻找主元的位置的方法来实现,因为主...

从N个数中选最小的K个数

   声明:题目来自: http://blog.csdn.net/v_JULY_v/archive/2010/11/17/6015165.aspx  JULY整理了100道微软等公司的面试题目,我想先...

最小的K个数31

题目描述:输入n个整数,找出其中最小的k个数。例如输入{ 4, 5, 1, 6, 2, 7, 3, 8} 这8个数字,则最小的4个数字是1, 2, 3, 4。解题思路: O(nlogk)的算法,特别适...

【July程序员编程艺术】之最小的k个数问题

题目描述:查找最小的k个元素 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。我的解题思路: 1.最容易想到的思路 ...

寻找最小的k个数(Select方法)

/* *寻找最小的k个数 *题目描述:5.查找最小的k个元素 *题目:输入n个整数,输出其中最小的k个。 *例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【刷题之路】最小的K个数
举报原因:
原因补充:

(最多只允许输入30个字)