《剑指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]最小的K个数

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

【剑指offer】最小的k个数

1、最直观的思路依然是对数组进行快速排序,而后取出前k个元素。这样的时间复杂度为O(nlogn) 2、这里可以采用类似于上面那道题目的基于Partition的方法,只是这次要求的分界点不是中位...
  • mmc_maodun
  • mmc_maodun
  • 2014年05月26日 08:16
  • 3844

剑指Offer面试题30(java版):最小的k个数

题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4...
  • jsqfengbao
  • jsqfengbao
  • 2015年08月08日 20:47
  • 2817

剑指Offer—编程题30(最小的k个数)

题目: 输入n个整数,找出其中最小的k个数。 例子说明: 例如输入4 、5 、1、6、2、7、3 、8 这8 个数字,则最小的4 个数字是1 、2、3 、4 解题思路: 解法一:O(n)时间...
  • u012129558
  • u012129558
  • 2016年06月12日 15:27
  • 221

剑指offer——最小的K个数(堆排或partition,复习排序算法思想精髓)

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。思路: 维护一个由k个值组成的动态最大堆。然后接下来的每个数字和堆...
  • qqqqq1993qqqqq
  • qqqqq1993qqqqq
  • 2017年06月21日 16:23
  • 103

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

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

《剑指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
  • 538

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

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

最小的k个数 剑指office原题

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

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

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路:运用快排的思想,每次排序后,point点左边的数都小于poin...
  • Alone_Rojer
  • Alone_Rojer
  • 2017年03月13日 16:41
  • 166
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《剑指offer》-最小的K个数
举报原因:
原因补充:

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