给定一个数组,打印所有可能的连续子序列,其总和可以被给定的数字x整除

时间:2015-08-12 12:54:56

标签: arrays algorithm dynamic-programming

给定一个数组,打印所有可能的连续子序列,其和可以被给定的数字x整除。

我可以看到一些相关问题: - [Find numbers of subarray of an array whose sum is divided by given number

[how to find the length of the longest contiguous subarray whose sum is divisible by a given number

所有要求打印最大阵列或最大阵列的长度。我想打印那些连续数组的所有组合,可以被给定的数字整除。 我试图解决这个问题并提出了这个解决方案

#include<iostream>
using namespace std;

void function(int arr[], int start, int end, int div, int sum)
{
    if(start>end)
        return;
    if(!(sum%div))
    {
        if(start<end)
        {
            for(int i=start;i<=end;i++)
            {
                cout<<"  "<<arr[i];
            }
            cout<<endl;
        }
    }
    function(arr, start+1, end, div, sum-arr[start]);
    function(arr, start, end-1, div, sum-arr[end]);
}

int main()
{
    int arr[] = {2, 6, 3, 8, 5, 7, 4, 1};
    int div;
    int size = sizeof(arr)/sizeof(*arr);
    cout<<"  Enter divisor :- ";
    cin>>div;
    int sum = 0;
    for(int i=0;i<size;i++)
        sum+=arr[i];
    function(arr, 0, size-1, div, sum);

    cout<<endl;
    system("PAUSE");
    return 0;
}

这段代码具有可怕的复杂性,我可以想到使用两个复杂度为O(n ^ 2)的循环的另一个解决方案。 我们能否以更好的n ^ 2时间复杂度来做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为你会读到答案 Find numbers of subarray of an array whose sum is divided by given number

如果是,那么您可以修改上述算法,如下所示:

Input:    0  5  3  8  2  1
X = 3
Sum:   0  0  5  8 16 18 19
Mod 3: 0  0  2  2  1  0  1

您需要做的就是在“mod 3”输出数组中看到相同值时打印数组。所以在上面的例子中,你将从索引[0],[2],[0,4],[1,4]和[4,5]打印数组。

0  5  3  8  2  1
-                     0                 =  0 % 3 = 0
-------------         0 + 5 + 3 + 8 + 2 = 18 % 3 = 0
   ----------         5 + 3 + 8 + 2     = 18 % 3 = 0
      -               3                 =  3 % 3 = 0
            ----      2 + 1             =  3 % 3 = 0