【发布时间】:2016-07-27 17:21:33
【问题描述】:
我在 HackerRank 上发现了这个问题,我们应该在那里找到最小的反素数(一个正整数是反素数当且仅当它的除数比任何其他小于自身的正整数都多)。
因此,如果用户输入 5 ,那么最小的反素数将是 6,因为 6 的除数比从 1 到 5 的任何数字都多。
我的方法:- 将每个数字 1 到 n 的除数存储在一个哈希集中,然后从 n+1 检查除数比哈希集中的除数多的整数。
public static int send(int n)
{
HashSet hs = new HashSet() ;
for(int i=1 ; i<=n ; i++)
{
hs.add(div(i)) ;
}
for(int i= n+1 ; ; i++)
{
if(Collections.max(hs).compareTo(div(i)) < 0 )
{
return i ;
}
}
}
public static int div(int n)
{
int ctr = 0 ;
for(int i=1 ; i<=n ; i++)
{
if(n % i == 0)
ctr++ ;
}
return ctr ;
}
该逻辑运行良好,但在所有测试用例中它返回超时,因为我看到它的复杂性是 O(n^2) 。
所以,请给我推荐一个更好的算法,它可以在相对较短的时间内完成。
【问题讨论】:
-
对于不赞成这个问题的人,请说明原因。我觉得这很粗鲁。
-
欢迎堆栈溢出...
-
你在 div 中的循环应该只达到 n 的 teh sqrt。
-
你应该在发送的第二个循环之前存储你的哈希集的最大值,以避免多次查找相同的值......
-
@RenukaDeshmukh 这实际上需要与在所有存储值最后调用一次 max 相同的比较次数,您节省了一点内存,但它不会对运行时产生太大影响。