《剑指offer》-最小的K个数

原创 2016年05月31日 21:25:47

题目描述

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

解法:1.进行数组的分区,返回分区index值

          2.根据index和k-1的大小来判断是否已经获取了足够的数,否则递归调用即可

          3.分区函数的编写,快速排序的思想

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int len = input.size();
        vector<int> output;
        if(len == 0 || k == 0 || k > len) return output;
        int start = 0;
        int end = len - 1;
        int index = partion(input, start, end);
        while(index != k - 1) { //k个数,但是最后一个下标为k-1
        if(index > k - 1) {  //说明范围还是太大了,进行缩小
            end = index - 1;
            index = partion(input, start, end);
        }
        else {
            start = index + 1; 
            index = partion(input, start, end);
        }
        }
        for(int i = 0; i < k; ++i) 
            output.push_back(input[i]);
        return output;
    }
    int partion(vector<int> &input, int start, int end) {
        int len = input.size();
        if(len == 0) return 0;
        int small = start - 1;
        int index = (start + end) / 2;
        swap(input[end], input[index]);  //把比较值放到最后去
        for(int index = start; index < end; ++index) {
            if(input[index] < input[end]) {//如果指向的值小于比较值,则继续移动
                ++small;
            if(index != small) //如果不等于的话,就是当前small指向的值较大,与后面的index互换
                swap(input[index], input[small]);
            }
        }
        ++small; //此时small才是指向较大的值,与最后的一个值进行互换
        swap(input[end], input[small]);
        return small;
    }
};


相关文章推荐

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

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

【剑指Offer学习】【面试题30:最小的k个数】

题目: 输入n个整数,找出其中最小的k个数。 解题思路: 解法一:O(n)时间算法,只有可以修改输入数组时可用。可以基于Partition函数来解决这个问题。 解法二: O(nlogk)的算法,精剧...

《剑指offer》:[30]最小的K个数问题

题目:输入N个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 方案一:就是先对数组进行排序,然后输出前K个数字。时间复杂度为O(N*l...
  • gogoky
  • gogoky
  • 2016年06月09日 21:51
  • 500

剑指Offer面试题30最小的K个数(涉及堆或快排)

面试题30:最小的K个数(涉及快排与堆) 输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。最简单的方法是先排序再输出,复杂度为...

最小的k个数 剑指office原题

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

剑指Offer系列-面试题30:最小的K个数

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路:运用快排的思想,每次排序后,point点左边的数都小于poin...

【剑指offer】之最小的k个数

 题目描述: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 分析:    java代码实现:...

[剑指Offer]最小的K个数

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 输入 int[] input:待搜索的数组 int ...

剑指offer27--查找数组中最小的k个数

输入n个整数,找出其中最小的k个数

《剑指offer》最小的K个数

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 题目链接:http://www.nowcoder.com/practic...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《剑指offer》-最小的K个数
举报原因:
原因补充:

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