你在一起
这是一道典型的滑动窗口题目,解题思路就是对于小于target的每一个数都创建一个滑动窗口,通过窗口滑动来进行判断。
我的题解:
class Solution {
//思路:滑动窗口解题
//1.用变量j代表滑动窗口的结束
//2.用变量i从0到target进行遍历,i为滑动窗口的开始
// 1.创建滑动窗口,并不断判断:
// 窗口包含的数字大于target 停止此次滑动窗口
// 窗口包含的数字小于target 窗口继续移动
// 窗口包含的数字等于target 将窗口里的数字加入到结果数组里
public int[][] findContinuousSequence(int target) {
// 创建结果数组
List<int[]> list=new ArrayList<>();
//遍历
for(int i=1;i<target;i++){
int sum=0;
//创建滑动窗口
for(int j=i;j<target;j++){
//定义变量求出和
sum=sum+j;
//进行判断
// 窗口包含的数字大于target 停止此次滑动窗口
if(sum>target)break;
// 窗口包含的数字小于target 窗口继续移动
if(sum<target)continue;
// 窗口包含的数字等于target 将窗口里的数字加入到结果数组里
if(sum==target){
//创建一个一维结果数组
int[] temp=new int[j-i+1];
//记录当前的i,便于后面的赋值
int te=i;
for(int i1=0;i1<temp.length;i1++){
temp[i1]=te++;
}
list.add(temp);
}
}
}
//创建一个二维数组
int[][] ans=new int[list.size()][];
//赋值给结果
for(int i=0;i<ans.length;i++){
ans[i]=list.get(i);
}
return ans;
}
}
评论区大佬的答案:(思路一致,这种写法时间复杂度更低)
class Solution {
public int[][] findContinuousSequence(int target) {
//创建一个list暂时储存
List<int[]> list = new ArrayList<>();
for (int l = 1, r = 1, sum = 0; r < target; r++) {
sum += r;
while (sum > target) {
sum -= l++;
}
if (sum == target) {
int[] temp = new int[r - l + 1];
for (int i = 0; i < temp.length; i++) {
temp[i] = l + i;
}
list.add(temp);
}
}
int[][] res = new int[list.size()][];
for (int i = 0; i < res.length; i++) {
res[i] = list.get(i);
}
return res;
}
}