【发布时间】:2012-07-31 02:39:07
【问题描述】:
给定一个数组,找出有多少这样的子序列(不需要是连续的),其中该子数组中的元素之和可以被 K 整除。
我知道一种复杂度为 2^n 的方法,如下所示。这就像找到 i=[0,n] 的所有 nCi 并验证 sum 是否可被 K 整除。 请提供类似线性/二次或 n^3 的伪代码。
static int numways = 0;
void findNumOfSubArrays(int [] arr,int index, int sum, int K) {
if(index==arr.length) {
if(sum%k==0) numways++;
}
else {
findNumOfSubArrays(arr, index+1, sum, K);
findNumOfSubArrays(arr, index+1, sum+arr[index], K);
}
}
【问题讨论】:
-
你提到的这种方法看起来更像是蛮力而不是分而治之,只是说
-
将原数组取模缩小到[0 .. (k-1)]的范围内,然后用动态规划计算组合的个数(一维是取模,另一维是您总结的元素数量)。
标签: algorithm optimization recursion dynamic-programming