如何降低时间复杂度以获取长型因子

时间:2019-02-02 04:30:17

标签: java time-complexity

我必须找到某个特定数字的因数并将其存储在数组列表中,最后我必须根据该叙事者的索引值检索一个数字。
对于小输入,我得到了正确的结果,但是对于大输入(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;
}

通过这种逻辑,我得到了预期的结果,但是对于某些测试用例,我却超时了,因此如何降低时间复杂度。

2 个答案:

答案 0 :(得分:2)

只需迭代直到math.sqrt(n)。但是,如果in的因数,那么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);

尝试一下