思路:
连续正整数序列,可以想到:
1)用滑动窗口
2)下标和值一一对应
代码:
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[] path=new int[j-i+1];
for(int x=i;x<=j;x++){
//注意下标是x-i
path[x-i]=x;
}
res.add(path);
s-=i;
i++;
}
//注意这里是>=,还要算上=的情况,所以s==target要放在最上面考虑
else if(s<target){
j++;
//因为是连续的正整数序列,所以值也是直接+-索引即可
s+=j;
}
else{
s-=i;
//注意顺序,j是要先自增,i是要先s减掉i
i++;
}
}
//二维数组的第一个[]必须要赋值长度
return res.toArray(new int[0][]);
}
}
分解:
1)使用双指针的滑动窗口
注意s<target时:
要先j++再改变s值
s>target时:
要先改变s值再i++
2)下标和值一一对应,改变s值只需要加减下标值i或j即可
3)toArray()方法要在括号内写上改变的形式,例如:
res.toArray(new int[0][])
4)i、j、s的初始化可以是:
int i=1,j=2,s=3;
因为是连续的,所以i、j指针从头开始,s就是i+j=3
复杂度分析:
时间复杂度:O(N) 2个指针只走了一轮
空间复杂度:O(1)
以下不算额外空间(List<int[]>也算是int[][])
List<int[]> res=new ArrayList<>();