当前位置: 首页 > 知识库问答 >
问题:

最长满意连续子阵列

闻人举
2023-03-14

A是一个数组,B是A中所有元素的质因数阶,< code>size(A)=N (1

 Input(condition):
     A={4,9,25,6}     B={2,3,5}       size(A)=N=4      size(B)=M=3
 Output:
     {4,9,25}
 Reason:
     the continuous subarray's accmulate must be a square number, so in A, there 6 subarraies,
    {4}           4=2^2
    {9}           9=3^2
    {25}          25=5^2
    {4,9}         4*9=6^2
    {9,25}        9*25=15^2
    {4,9,25}      4*9*25=30^2
    but we want find the longest one, that means the size of subarray must be bigest, so the result is {4,9,25}.

到目前为止,我还没有想过这个问题,所以没有什么成就,但是我保证我已经想了很久了,希望有帮助,谢谢!

共有2个答案

岳和泽
2023-03-14

这不是全部答案,但它应该让你继续前进:

如果每个质因数的精度为偶数倍,则累加为平方数。

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

优化提示:

对于优化的解决方案,将质因数分解存储为 32 位数字,其中 bit=1 表示奇数,bit=0 表示偶数,然后将它们 XOR 运算在一起。如果总数为 0,则累积是一个平方数。

王扬
2023-03-14

我将在Klas Lindbäck的回答中添加一些细节,并提出一个可能的解决方案。

首先,我们将乘积累加到位置< code>i,并将质因数分解存储在数组< code>partialPrimes中。按照Klas lindbck的建议,该数组将只包含指数是偶数(0)还是奇数(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

素数分解可以通过连续除以给定的素数因子并对相应的位进行异或来找到。

现在,为了检查是否所有因子都有偶数指数(因此,如果数字是平方数),我们可以简单地将分解与0进行比较。

为了得到部分产品的分解,我们可以在相应的指数上减去分解。因此,例如,为了计算乘积A[4]*A[5]*A[6]*A[17]的分解,我们可以只计算partialPrimes[7]-partialPrimes[3](index at end-index before)。

因此,要找到乘积为平方数的范围,我们需要找到相等的partialPrimes

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

代码只是用来说明整体思路,可能包含小错误。

如果我们假设素因子分解需要< code>O(d)时间,那么这个算法的总时间复杂度是< code>O(n * d)

 类似资料:
  • {4,5,1,5,7,6,8,4,1},答案是5。 对于第一个例子,子数组{5,3,1,4,2}排序后可以形成连续序列1,2,3,4,5,它们是最长的。 对于第二个示例,子数组{5,7,6,8,4}是结果子数组。

  • 我在Leetcode上遇到了这个问题,我看到了解决方案,但我无法理解它为什么工作。它适用于模数的什么性质?我们怎么能说我们已经找到了一个和等于k的子数组,只看前面的模结果呢? 问题:

  • 有人能为下面的问题提出一个简单的解决方案吗? 最长子数组:查找子数组中元素之和小于或等于“k”的最长连续子数组的长度。 输入为:< code>array和< code>k。 例子: 输出: 2个 解释: 子数组:{1},{2},}3},1,2},2,3},{1,2,3} {1,2} =

  • 给定一个整数数组,包含不超过两个不同值的最长子数组的长度是多少,使得非重复值的差异不超过 1? 例: 最大的子数组长度为4:[1,2,1,2]。 最大的子阵列具有长度4:[3,3,2,2]。值1和3相差1以上,因此[1,1,1,3,3]无效。

  • 本文向大家介绍手写算法:最长公共连续子序列相关面试题,主要包含被问及手写算法:最长公共连续子序列时的应答技巧和注意事项,需要的朋友参考一下 参考回答:    

  • 我从leet code https://leet code . com/problems/Maximum-Sum-of-Two-Non-Overlapping-Subarrays/中看到“两个非重叠子数组的最大和(特定给定长度,数组只包含正数)”。 但我遇到了这个问题的一个变体——“两个非重叠子数组(任意长度)的最大和,并且该数组包含正数和负数”。我看不到任何编码平台有这个问题需要我确认我的解决方