【问题标题】:Better Algorithm for finding smallest Antiprime for a given integer找到给定整数的最小反素数的更好算法
【发布时间】: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 相同的比较次数,您节省了一点内存,但它不会对运行时产生太大影响。

标签: java algorithm hashset


【解决方案1】:

您可以使用Set&lt;&gt; 数据结构,然后您可以存储每次除数达到峰值(反素数)。然后,您可以调用 ceiling() 之类的东西从数字中获取下一个最大的数字,因此对于 5,它将在 O(logn) 时间返回 6。此外,对于输出,使用StringBuilder 并构建结果然后输出。对我来说,它起初对System.out.println() 不起作用,但对StringBuilder 起作用,然后是append() 结果。最后,在StringBuilder 上执行.toString()。作为参考,我在比赛中总体排名第 8(超过 2000 名),所以当时它对我有用并且变得完美。

【讨论】:

    【解决方案2】:

    我在这里合并了 cmets 中提到的修改:

    public static int send(int n)
        {
            HashSet hs = new HashSet() ;
            for(int i=int(n/2)+1 ; i<=n ; i++)
            {
                hs.add(div(i)) ;
            }
            int markToBeat = Collections.max(hs);
            for(int i=n+1 ; ; i++)
            {
                if(div(i) > markToBeat )
                {
                    return i ;
                }
            }    
        }    
        public static int div(int n)
        {
            int ctr = 0 ;
            for(int i=1 ; i<=sqrt(n) ; i++)
            {
                if(n % i == 0)
                    ctr++ ;
            }    
            return ctr ;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2011-10-08
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多