题目要求得出和为s的所有连续整数序列。
想法:双指针形成滑动窗口,时刻记录双指针间的和。
当和与目标值相同,则将双指针间的数据记录下来,并且将左指针右移。
当和大于目标值,则将左指针右移(将和减小),且和需要减小原左指针值。
当和小于目标值,则将右指针右移(将和增大),且和需要减小原右指针值。
public int[][] findContinuousSequence(int target) {
int i = 1;
int j = 2;
int sum = 3;
List<int[]> res = new ArrayList<>();
while (i < j) {
if (sum == target) {
int[] tmp = new int[j - i + 1];
for (int k = i; k < j; k++) {
tmp[k - i] = k;
}
res.add(tmp);
}
if (sum >= target) {
sum -= i;
i++;
} else {
sum += ++j;
}
}
return res.toArray(new int[0][]);
}
注:
用于记录结果的数组,因为无法知道有多少个解,且每个解包含的数个数也不同,所以无法申请固定空间存储,故申请一个列表,每个元素是一个未定大小的数组存结果。
当找到解,解所包含的元素个数为右指针-左指针+1.
申请好数组后,从左指针开始遍历,以此给结果数组赋值即可。
最后返回一个由结果列表转成的一行,列不定的数组。