我必须找到某个特定数字的因数并将其存储在数组列表中,最后我必须根据该叙事者的索引值检索一个数字。
对于小输入,我得到了正确的结果,但是对于大输入(n = 10 ^ 15),我无法通过测试用例。
我正在将循环运行到'n / 2',那我知道,这是最糟糕的时间复杂度 在那之后,我尝试使用Math.sqrt(n),由于无法早点完成循环,因此我无法通过一些测试用例,因此我错过了一些因素。
public static long pthFactor(long n, long p) {
// Write your code here
ArrayList<Long> al=new ArrayList<>();
for(long i=1;i<=n/2;i++)
{
if(n%i==0)
al.add(i);
}
al.add(n);
if(p<=al.size())
{
int index=(int)(p-1);
return al.get(index);
}
else
return 0;
}
通过这种逻辑,我得到了预期的结果,但是对于某些测试用例,我却超时了,因此如何降低时间复杂度。
答案 0 :(得分:2)
只需迭代直到math.sqrt(n)
。但是,如果i
是n
的因数,那么n/i
也是如此。
for(long i=1; i * i <= n; i++)
{
if(n % i == 0) {
al.add(i);
if (i != n/i) {
al.add(n/i); // prevent counting twice for square integers
}
}
}
答案 1 :(得分:1)
for(long i=1;i<=Math.sqrt(n);i++)
{
if(n%i==0){
if(n/i==i)
al.add(i);
else {
al.add(i);
al.add(n/i);
}
}
}
Collections.sort(al);
尝试一下