Algorithm 最长满足连续子阵

Algorithm 最长满足连续子阵,algorithm,Algorithm,A是一个数组,B是A中所有元素的素因子顺序,sizeA=n1这不是全部答案,但它应该让你开始: 如果每个素数因子的累加次数为偶数,则累加为一个平方数 因此,对于每个可能的子数组,计算yeach素因子的出现次数。如果每个因子的出现次数为偶数,则子阵列的累积为一个平方数 优化提示: 对于优化的解决方案,将素因子分解存储为32位数字,位=1表示奇数,位=0表示偶数,然后将它们异或:相加。如果总数是0,那么累加就是一个平方数。我将为克拉斯·林德贝克的答案添加一些细节,并提出一个可能的解决方案 首先,我们

A是一个数组,B是A中所有元素的素因子顺序,sizeA=n1这不是全部答案,但它应该让你开始:

如果每个素数因子的累加次数为偶数,则累加为一个平方数

因此,对于每个可能的子数组,计算yeach素因子的出现次数。如果每个因子的出现次数为偶数,则子阵列的累积为一个平方数

优化提示:


对于优化的解决方案,将素因子分解存储为32位数字,位=1表示奇数,位=0表示偶数,然后将它们异或:相加。如果总数是0,那么累加就是一个平方数。

我将为克拉斯·林德贝克的答案添加一些细节,并提出一个可能的解决方案

首先,我们将把乘积累加到位置i,并将素因子分解存储在数组的partialPrimes中。该数组将只包含指数是偶数0还是奇数1,作为Klas Lindbäck建议的位字段

因此,partialPrimes[0]将包含A[0]的分解。partialPrimes[1]将包含A[0]*A[1]的分解,依此类推

此外,我们还存储了给定分解的最大索引映射

int partialPrimes[N]
lastPartialPrimes := 0
maxPrime = new Map<int, int>
for i from 0 to N - 1
    int primes = calculatePrimeDecomposition(A[i], B)
    partialPrimes[i] = lastPartialPrimes xor primes
    lastPartialPrimes = primes
    maxPrime[primes] = i
next
代码仅用于说明总体思路,可能包含一些小错误


如果我们假设素因子分解需要Od时间,那么该算法的总体时间复杂度为*d

,您的问题是…?问题是如何找到累积为平方数的最长连续子阵列。询问代码的问题必须证明对所解决问题的最低理解。包括尝试过的解决方案、它们不起作用的原因以及预期结果。另请参见:我想您需要了解最大连续子阵列算法的概念,然后对其稍加修改以适应您的问题。@DanKruchinin这是两个非常不同的问题。我认为你不能稍微修改max子数组算法。检查所有子数组的普通算法是在^2*M上。
int partialPrimes[N]
lastPartialPrimes := 0
maxPrime = new Map<int, int>
for i from 0 to N - 1
    int primes = calculatePrimeDecomposition(A[i], B)
    partialPrimes[i] = lastPartialPrimes xor primes
    lastPartialPrimes = primes
    maxPrime[primes] = i
next
int maxLength = -1
int start = -1, end = -1
for i from 0 to N - 1
    //check if this product is already a square number
    if(partialPrimes[i] == 0 && maxLength < i + 1) 
    {
        maxLength = i + 1
        start = 0
        end = i
    }
    //is there a equal decomposition?
    else if maxPrime.contains(partialPrimes[i])
    {
        int newEnd = maxPrime[partialPrimes[i]]
        int newStart = i + 1
        int newLength = newEnd - newStart + 1
        if(newLength > maxLength)
        {
            start = newStart
            end = newEnd
            maxLength = newLength
        }
    }
next