一、需求
-
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
-
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
二、暴力法
2.1 思路分析
- 根据需求,我们要找一个连续的正整数序列,其和为target,那么我们可以在1 ~ target中找,即target = 9时,我们就在 1 2 3 4 5 6 7 8 9中寻找;
- 因为题目要求序列长度至少为2,我们设置两个变量来控制这个序列的边界,令 i 指向序列的左边界,j 指向序列的右边界,如上例所示,当 i 指向4,就是左边界的最大值,j 指向的右边界的最大值 = i 指向左边界的最大值 + 1;
- 故左边界的上界为 (target - 1) / 2,右边界的上界为 (target + 1) / 2;
- 暴力法的思路就是在边界范围内,求出每一个连续正整数序列的和,使用 sum 来记录和,边求和边判断,①若 sum > target,说明当前以某位数为起点的连续整数和不符合要求,直接break,移动到该位数的下一位,比如移动到示例中 3 4 5 ,此时 sum = 12,直接退出进行下一轮,更新左边界为 4,②若 sum < target,j++,继续累加,③ 若sum == target,将当前的 [i,j ] 加入到数组中。退出循环,将数组加入到list中;
2.2 代码实现
class Solution {
public int[][] findContinuousSequence(int target) {
//数组为引用类型
List<int[]> list = new ArrayList<&