剑指 Offer 57 - II. 和为s的连续正数序列
题目描述
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
输入输出
1 2 3 4 5
| 输入:target = 9 输出:[[2,3,4],[4,5]]
输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]]
|
基本思路
初始化: 左边界 i = 1 ,右边界 j = 2 ,元素和 s = 3 ,结果列表 res ;
循环: 当 i >= j 时跳出;
当 s > target 时: 向右移动左边界 i = i + 1 ,并更新元素和 s ;
当 s < target 时: 向右移动右边界 j = j + 1 ,并更新元素和 s ;
当 s = target 时: 记录连续整数序列,并向右移动左边界 i = i + 1 ;
返回值: 返回结果列表 res ;
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public int[][] findContinuousSequence(int target) { int i = 1, j = 2, s = 3; List<int[]> res = new ArrayList<>(); while(i < j){ if(s == target){ int[] ans = new int[j-i+1]; for(int k = i; k <= j; k++){ ans[k-i] = k; } res.add(ans); } if(s >= target){ s -= i; i++; } else if(s < target){ j++; s += j; } } return res.toArray(new int[0][]); } }
|