题目
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
解题思路
这题比较简单, 首先他要求的是序列最少两个,那么可以知道的是他最大的取值只可能是target/2+1, 举例15,15/2+1 = 8, 7+8=15,不可能取值取到9,同理偶数也可以如此证明,然后我们知道最大之后,发现他是一个连续正整数序列, 我们就可以使用滑动窗口去处理这题了,而且因为是连续的, 这里的下标和值可以放一起使用,这边指定一个start的下标和一个end的下标,如果start+…+end的值大于target值, 我们直接让start从之前start的下一位开始移动, 如果 start+…+end的值小于target值, 我们就让end下标往后挪一位,如果相等, 这里我们就可以创建一个tmp的数组去存放这些结果了, 最后通过List转Array去返回最后的答案即可, 具体代码如下。
Java代码实现
import java.util.ArrayList;
import java.util.List;
public class FindContinuousSequence {
public static int[][] findContinuousSequence(int target) {
int biggestValue = target / 2 + 1;
int start = 1;
int tmpStart = start;
int end = 2;
int sum = start + end ;
List<int[]> res = new ArrayList<>();
while(start < end && start < biggestValue){
if(sum > target){
start = tmpStart +1;
tmpStart ++;
end = start + 1;
sum = start + end;
} else if (sum < target) {
end ++;
sum = sum + end;
}else{
int len = end-start + 1;
int[] tmp = new int[len];
for (int i = 0; i < len; i++) {
tmp[i] = start;
start ++;
}
res.add(tmp);
start = tmpStart +1;
tmpStart ++;
end = start + 1;
sum = start + end;
}
}
return res.toArray(new int[res.size()][]);
}
}