我正在研究Project Euler问题14,但我不明白问题是什么。程序运行大约8秒钟后,我一直收到运行时错误-大概ArrayLists太大了,但是如何避免这种情况呢?

import java.util.ArrayList;

public class Problem14
{
    public static void main(String[] args)
    {

        ArrayList<ArrayList<Long>>listOfLists=new ArrayList<ArrayList<Long>>();

        for (long c=2; c<1000000; c++)
        {
            ArrayList<Long>tempList=new ArrayList<Long>();
            long h=c;
            while (h!=1)
            {
                tempList.add(h);
                if (h%2==0)
                    h/=2;
                else
                    h=((3*h)+1);
            }
            tempList.add(1l);
            listOfLists.add(tempList);
        }

        long maxLength=0;
        long maxPos=0;

        for (int currList=0; currList<listOfLists.size(); currList++)
        {
            long currLength=(listOfLists.get(currList).size());
            if(currLength>maxLength)
            {
                maxLength=currLength;
                maxPos=currList+1;
            }
        }
        System.out.println("The longest sequence is "+maxLength+" numbers
                long. Its position is "+maxPos);
    }
}

最佳答案

您已用可用的堆内存运行JVM。问题线是

ArrayList<Long>tempList=new ArrayList<Long>();


这在运行一百万次并保持不变的循环中,因此您已制作了一百万个数组列表。使用-Xmx可能需要更好的数据结构或更多的内存。

本着Euler项目的精神,您应该寻找一种避免使用列表列表的方法。

10-08 17:58