【问题标题】:More efficent solution required需要更有效的解决方案
【发布时间】:2015-06-30 16:22:09
【问题描述】:

以下是我尝试练习的在线编程竞赛之一的问题。
我已经解决了,但我正在寻找更有效的解决方案。

问题:
从左到右有 n 个对象,从 1 到 n 编号。
第 i 个对象的长度正好是 ai 英尺。
一组对象是线的非空连续段。组的大小是该组中对象的数量。组的强度是该组中对象的最小长度。
对于每个 x 使得 1 ≤ x ≤ n 在所有大小为 x 的组中的最大强度。

输入
输入的第一行包含整数n(1 ≤ n ≤ 2 × 10^5),即对象的个数。
第二行包含 n 个用空格分隔的整数,a1, a2, ..., an (1 ≤ ai ≤ 10^9),对象的长度。

输出
在一行中打印 n 个整数。对于从 1 到 n 的每个 x,打印所有大小为 x 的组中的最大强度。

示例测试用例:
输入

10
1 2 3 4 5 4 3 2 1 6

输出
6 4 4 3 3 2 2 1 1 1


我的解决方案:

#include <iostream>

int row1[200000];
int row2[200000];
int max[200000];

int main()
{
    int bears;
    int next;
    int *old_row = NULL;
    int *curr_row = NULL;

    std::cin >> bears;
    std::cin >> next;

    row1[0] = next;
    max[0] = next;

    old_row = row1;
    curr_row = row2;

    for(int i = 1; i < bears; i++)
    {
        std::cin >> next;
        curr_row[0] = next;

        if (next > max[0])
        {
            max[0] = next;
        }

        for(int j = 1; j <= i; j++)
        {
            curr_row[j] = old_row[j-1] < next ? old_row[j-1] : next;
            if (curr_row[j] > max[j])
            {
                max[j] = curr_row[j];
            }
        }

        int *temp = old_row;
        old_row = curr_row;
        curr_row = temp;
    }

    for(int i = 0; i < bears; i++)
    {
        std::cout << max[i] << " ";
    }

    return 0;
}

这是我能想到的最佳解决方案。
请提出一个有效的解决方案。

谢谢

【问题讨论】:

  • 提示:从最长到最短考虑对象并查看它们的位置。
  • 这个问题更适合 Code Review SE 网站。
  • 那么,您只是将一组整数从最大值排序到最小值?是的,有一些方法可以非常快地做到这一点 - 肯定比冒泡/插入排序更快。查看各种计数/基数排序以开始。
  • 我投票结束这个问题,因为它属于codereview.stackexchange.com

标签: c++ algorithm


【解决方案1】:

实际上不是答案。我只是发现以 Python 表达式的形式表达解决方案很有趣:

>>> d = [1, 2, 3, 4, 5, 4, 3, 2, 1, 6]
>>> print [max(min(d[i:i+l]) for i in range(len(d)-l+1)) for l in range(1,len(d)+1)]
[6, 4, 4, 3, 3, 2, 2, 1, 1, 1]

不是因为性能,而是因为紧凑。

【讨论】:

    【解决方案2】:

    这里不会给你代码,以防你想自己设计一个实现。 (破坏你想要的练习。)但是看看这些:

    维基百科文章总是不错的起点: https://en.wikipedia.org/wiki/Radix_sort

    真的很好,更深入的解释:https://www.cs.princeton.edu/~rs/AlgsDS07/18RadixSort.pdf

    这实际上显示了如何做到这一点,不确定您是否想要: http://www.sanfoundry.com/cpp-program-implement-radix-sort/

    【讨论】:

    • 但是排序并不能解决问题……数字的相对位置很重要。请注意,输入中有一个 5,但输出中没有 5(和一个额外的 1)。
    • 啊,对不起;我完全错过了。我刚刚看到一个从大到小的排序问题。您可能仍然可以使用一些基数公式来加快速度;它通常是更优化的类型之一。 (只需修改以应用所需的特定操作。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2011-05-05
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多