子k的总数k

时间:2015-02-09 05:55:58

标签: arrays algorithm data-structures

我刚刚在编程竞赛中解决了这个问题,并且无法在规定的时间限制内解决这个问题。所以只是好奇才能找到正确的方法。任何建议都会有所帮助。

输入 给定具有n个元素的matix a [],其中n <1000。 整数k,其中k <10 ^ 9

构建一个新的矩阵b,其中b[i][j]=a[i]*a[j]

输出 具有和k的可能子矩阵的数量。

测试用例

a[]={1,-1}
k=0

输出= 5 的解释

b={ 1,-1,
   -1, 1}

所以2行子集,2列子集和1个完整数组。总共5。

我尝试使用类似https://math.stackexchange.com/questions/639172/submatrix-with-sum-k

之类的东西来解决

1 个答案:

答案 0 :(得分:2)

对于子数组总和b[i][j] -> b[i + m]b[j + n],它等于

X =   a[i]*(a[j] + a[j + 1] + ... + a[j + n])
    + a[i + 1]*(a[j] + a[j + 1] + ... + a[j + n])
    + ...
    + a[i + m]*(a[j] + a[j + 1] + ... + a[j + n])
  = sum(a[i] + ..a[i + m])*sum(a[j] +... a[j + n])

因此,任务被简化为在数组a中找到两个段,并且它们的总和相乘等于k

要查找a中的所有细分和,可以在 O(n ^ 2)中完成。

将所有总和存储在HashSet或类似内容中,我们可以在 O(n ^ 2)时间复杂度中找到答案。