【九度OJ】题目1431:Sort 解题报告

标签(空格分隔): 九度OJ


[LeetCode]

http://ac.jobdu.com/problem.php?pid=1431

题目描述:

给你n个整数,请按从大到小的顺序输出其中前m大的数。

输入:

每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,
且都处于区间[-500000,500000]的整数。

输出:

对每组测试数据按从大到小的顺序输出前m大的数。

样例输入:

5 3
3 -35 92 213 -644

样例输出:

213 92 3

Ways

本来是个排序题,但是注意到时间复杂度,所以只能用Hash的方法解决。

处理比较难的地方在输入的数字可以有负,所以,如何处理偏移是个难点。

另外注意,一定在每个循环里边都要把数组给清零复位。要不然以前的数据会影响之后的数据。

#include <stdio.h>

#define OFFSET 500000

int hash[1000001] = {0};

int main() {

    int n, m;

    while (scanf("%d%d", &n, &m) != EOF) {

        for (int i = -500000; i <= 500000; i++) {
            hash[i + OFFSET] = 0;
        }

        for (int i = 0; i < n; i++) {
            int temp;
            scanf("%d", &temp);
            hash[OFFSET + temp] = 1;
        }

        for (int i = 500000; i >= -500000; i--) {
            if (hash[i + OFFSET] == 1) {
                printf("%d", i);
                m--;
                if (m != 0) {
                    printf(" ");
                } else {
                    printf("\n");
                    break;
                }
            }

        }

    }
    return 0;
}

Date

2017 年 2 月 16 日