问题:
1. 给定一个数组其每个元素都是正数,和一个给定值M,求所有连续的子数组其和等于M。
2. 给定一个正数N,求所有和为N的连续正数序列。
这类求子数组之和的问题与编程之美2.12——快速寻找满足条件的两个数或三个数问题的求解思路相似,都是可用双指针法在O(n)的时间内解决。
1.解法:
我们让两个指针i,j都从数组的第一个元素开始,记变量sum初始化为第一个元素的值,sum表示子数组[i,j]的元素之和。在每步操作中,若sum的值小于等于M,则j增加1,并且让sum加上元素A[j];若sum的值大于M,则先让sum减去元素A[i],再i增加1。
// 求连续子序列和等于m
void FindSumK(int *A, int n, unsigned int m)
{
int i, j;
i = j = 0;
int sum = A[0]; // 表示子数组[i,j]的元素之和
// 当j==n时,说明