我正在研究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项目的精神,您应该寻找一种避免使用列表列表的方法。