子数组和问题,和被元素个数整除

来源:互联网 发布:c语言pow什么意思 编辑:程序博客网 时间:2024/05/10 07:52

类似问题:子数组和被10整除。

给你一个数组,要求找出一个子数组,使得该子数组的和可以被整个数组的元素个数整除。例如,下面的数组有10个元素,子数组A[3]+A[4]+A[9] mod 10 = 0.


思路:

设prefix_sum[j] = ( A[0] + A[1] + ...  + A[j] ) mod n. 其中,n是A中元素的个数。

那么

case1:prefix_sum[j],j = 0,1,...,n-1,都是不相等的,而且存在一个prefix_sum[j] = 0.

case2:存在prefix_sum[a] = prefix[b], a<b.

所以

case1:0到j构成的子数组就是所求数组。

case2:a+1到b构成的子数组就是所求数组。

代码如下:

vector<int> find_0_sum_subset(const vector<int> &A) {vector<int> prefix_sum(A);for (int i = 0; i < A.size(); ++i) {if (i - 1 >= 0)prefix_sum[i] += prefix_sum[i - 1];prefix_sum[i] %= A.size();}vector<int> table(A.size(), -1);vector<int> ans;for (int i = 0; i < A.size(); ++i) {if (prefix_sum[i] == 0) {for (int j = 0; j <= i; ++j)ans.push_back(j);return ans;} else if (table[prefix_sum[i]] != -1) {for (int j = table[prefix_sum[i]] + 1; j <= i; ++j) ans.push_back(j);return ans;}table[prefix_sum[i]] = i;}}


原创粉丝点击