【问题标题】:Number of submatrix with sum k总和为 k 的子矩阵数
【发布时间】:2023-03-29 11:01:01
【问题描述】:

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

输入 给定一个包含 n 个元素的矩阵 a[],其中 n

构造一个新矩阵 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 的方法来解决问题

【问题讨论】:

  • 我投票结束这个问题,因为它是一个编程竞赛问题转储。

标签: arrays algorithm data-structures


【解决方案1】:

对于子数组和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)时间复杂度中找到答案。

【讨论】:

  • 完成..我认为我们也可以降低第二步的复杂性(找到所有段的总和。)
  • @MuditAgarwal 是的,我们只需要检查所有数字a 其中k % a == 0a <= square_root(k),所以检查步骤是O(square_root(k)) 记住要注意正负情况.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 2020-05-12
  • 1970-01-01
相关资源
最近更新 更多