先上图:
我的理解:我们利用一个数组来充当一个滑动窗口,左闭右开。用low指针来指向窗口的左端,用high来指向窗口的右端,注意high指针是开区间。用res来记录滑动窗口当前所有的和,为此可以简化计算,不用每次都循环求区间和。用list集合来存储每个解的数组。
- res < target 此时需要增加滑动窗口的总值,为此需要右移一位high,同时将high的值加入到res中;
- res > target 此时需要减少滑动窗口的总值,为此需要右移一位low,同时减去low的值;
- 当res == target时,构建一个数组,将滑动窗口中的数值放入数组中,并加入到list集合。然后res减去low的值,将low右移一位,继续求解。
- 将上述if else if 模块放在while(low <= target / 2)的循环之中。为啥是low <= target / 2呢,因为一个数,如果是偶数,例如12,那么12/2=6,low=6是就无解了,再运行一次low = 7就弹出了;而target = 13时,13 / 2 = 6,6+7=13,还有一个解。
代码:
class Solution {
public int[][] findContinuousSequence(int target) {
int low = 1, high = 1, res = 0;
ArrayList<int[]> list = new ArrayList<>();
while (low <= target / 2) {
if (res < target) {
res += high;
high++;
} else if (res > target) {
res -= low;
low++;
} else {
//装载
int[] tmp = new int[high - low];
int j = 0;
for (int i = low; i < high; i++) {
tmp[j] = i;
j++;
}
list.add(tmp);
//进行后续操作,避免死循环
res -= low;
low++;
}
}
return list.toArray(new int[list.size()][]);
}
}
代码最后list生成一个二维数组,是我新接触的点。可以参考我的收藏,里面 有一篇源码解析。