YTU 2250 查找最小的k个元素 TOP K问题

TOP K问题

题目描述

题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4

输入

输入:

8 4

1 2 3 4 5 6 7 8

输出

1 2 3 4

样例输入
8 4

1 2 3 4 5 6 7 8

样例输出
1 2 3 4

扫描二维码关注公众号,回复: 4995902 查看本文章

这道题目很简单,但是做题的时候不能只要求会做一种题目吧。
其实这道题并没有想象的那么,嗯,简单。准确的来说,只是一道TOP K问题(有兴趣可以百度,在此不做赘述)。就这一道题来说AC并不难,但是算法并没有达到最优。
这里只给出最优思路,即快排排序进行到 k 时,左面的一定是比 mxn[k]小的。
代码如下:

#include <iostream>
using namespace std;

int mxn[1000];
int k;
void qksort(int l,int r)
{
    int i,j,t,temp;
    if(r <= k - 1 || l >= k-1)
        return;
    if(i > j)
        return;
    temp = mxn[l];
    i = l,j = r;
    while(i != j)
    {
        while(mxn[j] >= temp && i < j)
            j--;
        while(mxn[i] <= temp && i < j)
            i++;
        if(i < j)
        {
            t = mxn[i];
            mxn[i] = mxn[j];
            mxn[j] = t;
        }
    }
    mxn[l] = mxn[i];
    mxn[i] = temp;
    qksort(l,i-1);
    qksort(i+1,r);
}
int main()
{
    int n;
    cin>>n>>k;
    for(int i = 0;i < n;i++)
        cin>>mxn[i];
    qksort(0,n-1);
    for(int i = 0;i < k; i++)
        cout<<mxn[i]<<" ";
}

开始的时候少考虑了一种情况TLE了。

文中有不妥之处,望各位大佬指出。

猜你喜欢

转载自blog.csdn.net/qm230825/article/details/86557456