【问题标题】:Magical array A of N integers with K length长度为 K 的 N 个整数的神奇数组 A
【发布时间】:2018-12-21 08:29:00
【问题描述】:

给定一个由 N 个整数组成的数组 A,如果它的所有元素都恰好有 3 个除数,则该数组称为魔法数组。现在您必须将给定的数组转换为神奇的K 长度数组。您可以按任何时间顺序执行以下操作。

  1. 将数组中任意元素的值加1。

  2. 将数组中任意元素的值减1。

  3. 删除数组的任意元素。

约束:

1 <= N <= 1000000
1 <= K <= N
1 <= A <= 1000000

Sample Input
5(size of the array) 3(K)
1 4 10 8 15

Output
4

我尝试过的解决方案:

迭代数组的每个元素,检查素数平方附近,并将此差异添加到全局计数操作(用于计算所需操作的变量)。这个时间顺序是n^2。

寻找更好的解决方案。

【问题讨论】:

  • 你想最小化什么?算法的运算次数或计算时间?
  • 计算时间小于 n^2 的数量级,寻找更好的解决方案来清除所有边缘情况。就目前而言,我的解决方案没有清除边缘情况,我也不知道确切的边缘情况。

标签: arrays algorithm number-theory


【解决方案1】:

用最接近的素数平方差的绝对值制作一个数组

使用QuickSelect算法分离K较小的差异(平均复杂度趋于O(N),而最坏的二次方情况是可能的)

计算它们的总和

【讨论】:

    【解决方案2】:

    你可以尝试用下面的方法找到3个除数的数字

    void numbersWith3Divisors(int n) 
    { 
        boolean[] isPrime = new boolean[n+1]; 
        Arrays.fill(isPrime, true); 
        isPrime[0] = isPrime[1] = false; 
    
        for (int p=2; p*p<=n; p++) 
        { 
           if (isPrime[p] == true) 
            { 
                for (int i=p*2; i<=n; i += p) 
                    isPrime[i] = false; 
            } 
        } 
    
        System.out.print("Numbers with 3 divisors :- "); 
        for (int i=0;  i*i <= n ; i++) 
            if (isPrime[i]) 
                System.out.print(i*i + " "); 
    } 
    

    同样可以申请数组,

    希望对你有帮助

    【讨论】:

    • 在没有找到素数平方时阅读整个问题。
    • 请测试我的代码,它不是寻找素数,它会给出给定数字的除数
    • 是的,找到素数平方/3 除数是正确的。但是您需要创建一个长度为 N 到 K 的数组。其中 K 大小数组中的每个元素都应该有 3 个除数。
    • 我相信使用上述方法我们可以迭代数组并做同样的事情
    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 2020-04-25
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多