剑指 Offer 57 - II. 和为s的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
/*
1.输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)
2.序列内的数字由小到大排列,不同序列按照首个数字从小到大排列*/
class Solution {//使用滑动窗口来处理相关的数据
public int[][] findContinuousSequence(int target) {
int left = 0;//窗口的左边界
int right = 1;//设置窗口的右边界
int sum = left + right;//对两者的数进行求和
ArrayList<int []> list = new ArrayList<>();//将用来存放将要记录的数据
//根据左窗口的数字必须小于target / 2 ,否则就不满足连续正整数序列等于target
while(left <= target / 2) {
if(sum < target) {//当窗口内的数值小于target就将右窗口边界向右移动一位
sum += ++right;
}else if(sum > target){//当窗口的数值大于target则将左窗口的边界向右移动一位
sum -= left++;
}else {
//如果找到等于target的数,就将其记录下来,同时向右移动左右边界
int [] arr = new int[right - left + 1];//定义一个数组来记录等于target的数
for(int n = left; n <= right; n ++) {
arr[n - left] = n;//遍历
}
list.add(arr);//添加在集合中
//左边和右边同时往右移一位
sum -= left++;
sum += ++right;
}
}
return list.toArray(new int [list.size()][]);//转化为数组
}
}
总结:这里面的相关的边界问题要注意,在判断窗口值左右边界值自增时,注意条件是否满足。