最小的K个数

最小的K个数

  • 时间限制:1秒
  • 空间限制:32768K
  • 本题知识点: 数组
题目描述

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

牛客网题目链接:点击这里

方法一:

VS2010代码:

#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> KNum;
        int InputNum=input.size();
        if(InputNum==0 || k==0 || k>InputNum) return KNum;
        KNum.assign(input.begin(), input.begin()+k );
        //对这K个数进行快速排序。
        QuickSort(KNum, 0, k-1);
        //用插入算法对后面的数进行遍历
        for(int i=k; i<InputNum; i++ )
        {
            if(input[i]<KNum[k-1])
            {
                int j=k-1;
                for(; input[i]<KNum[j-1] && j>0; j--)
                {
                    KNum[j]=KNum[j-1];
                }
                KNum[j]=input[i];
            }
        }
        return KNum;

    }
    void QuickSort(vector<int> &Array, int begin, int end)
    {
        if(begin>=end) return;
        int temp=Array[begin];
        int i=begin,j=end;
        while(i<j)
        {
            while(i<j && Array[j]>temp) j--;
            while(i<j && Array[i]<=temp) i++;
            if(i!=j) swap(Array[j],Array[i]);
        }
        if(begin!=j)
            swap(Array[begin],Array[j]);
        QuickSort(Array,begin,j-1);
        QuickSort(Array,j+1,end);
    }
};

int main()
{
    Solution s1;
    vector<int> test1;
    vector<int> result1;
    test1.push_back(4);
    test1.push_back(5);
    test1.push_back(1);
    test1.push_back(6);
    test1.push_back(2);
    test1.push_back(7);
    test1.push_back(3);
    test1.push_back(8);
    //test1.push_back(4);
    //s1.QuickSort(test1, 0, 8);

    for(int i=0; i<test1.size(); i++)
        cout<<test1[i]<<'-';
    cout<<endl;

    result1=s1.GetLeastNumbers_Solution(test1,4);
    for(int i=0; i<result1.size(); i++)
        cout<<result1[i]<<'-';
    cout<<endl;
}

//桶排序,内存开销太大。基于事先知道输入数字的范围。
//快速排序和插入排序相结合。
//测试用例:[]。 输出应为空[];
//测试用例:[4,2,6,3],7。 输出应为空[]

方法二:

//方法二:有快速排序法的思想启发而来,只要最小的K个数,而不需要对这K个数排序。
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> KNum;
        int InputNum=input.size();
        if(InputNum==0 || k==0 || k>InputNum) return KNum;
        //改进快速排序方法
        QuickSort1(input,0,InputNum-1,k);
        KNum.assign(input.begin(),input.begin()+k);
        //对选定的数进行快速排序
        QuickSort(KNum,0,k-1);
        return KNum;

    }
    void QuickSort1(vector<int> &Array, int begin, int end, int k)
    {
        if(begin>=end) return;
        int temp=Array[begin];
        int i=begin,j=end;
        while(i<j)
        {
            while(i<j && Array[j]>temp) j--;
            while(i<j && Array[i]<=temp) i++;
            if(i!=j) swap(Array[j],Array[i]);
        }
        if(begin!=j)
            swap(Array[begin],Array[j]);
        if(j==k-1 || j==k) return;
        if( k<j ) 
            QuickSort1(Array,begin,j-1,k);
        if( k>j)
            QuickSort1(Array,j+1,end,k);
    }
    void QuickSort(vector<int> &Array, int begin, int end)
    {
        if(begin>=end) return;
        int temp=Array[begin];
        int i=begin,j=end;
        while(i<j)
        {
            while(i<j && Array[j]>temp) j--;
            while(i<j && Array[i]<=temp) i++;
            if(i!=j) swap(Array[j],Array[i]);
        }
        if(begin!=j)
            swap(Array[begin],Array[j]);
        QuickSort(Array,begin,j-1);
        QuickSort(Array,j+1,end);
    }
};
牛客网通过代码图片:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值