1

我本来希望这段代码能够快速执行,但是对于 5000 个元素的列表,它在我杀死它之前运行了超过 20 分钟。

是因为 list.contains() 吗?

有任何想法吗?

     public static int PNum(int N)
     {
        List<int> result = new List<int>();
        for (int i = 1; i <= N; i++)
            result.Add(i * (3 * i - 1) / 2);

        int len = result.Count;
        int minDiff = 10000;
        int sum = 0, diff = 0;
        for (int i = 0; i <= len - 1; i++)
        {
            for (int j = i + 1; j <= len - 1; j++)
            {
                diff = result[j] - result[i];
                if (result.Contains(diff))
                {
                    sum = result[i] + result[j];
                    if (result.Contains(sum))
                    {
                        if (diff < minDiff)
                            diff = minDiff;
                    }
                }
            }
        }
        return minDiff;
    }
4

1 回答 1

6

N是 5000。因此,您的外循环运行 5000 次迭代,内循环运行 5000 次迭代,并且List<T>.Contains迭代每个元素,因此它也完成了 5000 次迭代的工作。

因此,您的循环至少要执行大约 5000 3 = 125,000,000,000 次操作,这将需要相当长的时间。

问题确实是您使用List.Contains. 使用 aHashSet代替(或另外)来获得 O(1)Contains测试。

于 2013-03-09T20:09:00.670 回答