57(2)-和为s的连续正数序列
小于 1 分钟
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
输入:target = 9 输出:[[2,3,4],[4,5]] 输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]]
这里注意,子串是指连续的,子序列是不一定连续的,但连续的正整数序列实际就是子串。
双指针
还是使用双指针算法,两个指针表示这个子串的头尾,当子串和为target时,记录。移动指针时对sum进行加减。
public int[][] findContinuousSequence(int target) {
List<List<Integer>> data = new ArrayList<>();
int i = 1, j = 2;
int sum = i + j;
while (i < j && j < target) {
if(sum == target){//如果找到了,记录下,然后j前进
data.add(IntStream.range(i, j + 1).boxed().collect(Collectors.toList()));
j++;
sum += j;
} else if (sum < target) { //
j++;
sum += j;
}else{
sum -= i;
i++;
}
}
int[][] result = new int[data.size()][];
for (int k = 0; k < data.size(); k++) {
result[k] = data.get(k).stream().mapToInt(Integer::intValue).toArray();
}
return result;
}