算法1:使用暴力算法
总结出来和最多只可能出现在target/2+target/2+1,所以循环的地方就是target/2+1
错误点:1.因为是个二维数组,所以有一点懵,总结就是可以使用list<int[]> 来定义二维数组,在最后的时候将其进行转换,list.toArray(new int[list.size()][])
class Solution {
//这道题没有写出来的原因就是因为自己是暴力解法,所以由于害怕没有写出来
public int[][] findContinuousSequence(int target) {
//这个算法主要考察 暴力算法的话主要考察二维数组
int mid = target/2;
List<int[]> list = new ArrayList<>();
for(int i=1;i<=mid+1;i++){
int sum = 0;
for(int j=i;j<=mid+1;j++){
sum+=j;
if(sum==target){
//记录从开始的j到最后的j的位置
int[] arr = new int[j-i+1];
for(int k = i;k<=j;k++){
arr[k-i]=k;
}
list.add(arr);
break;
}
if(sum>target){
break;
}
}
}
// Integer[] array = new Integer[list.size()];
// list.toArray(array);
return list.toArray(new int[list.size()][]);
}
}
第二种方法是滑动窗口的算法,滑动窗口的优势就是只需要遍历一次,所以本道题的可以只遍历一次,然后用左右指针的方式进行相加求和
class Solution {
public int[][] findContinuousSequence(int target) {
int pre = 1,cur =1;
int sum =0;
List<int[]> list = new ArrayList<>();
while(pre<=target/2+1){
sum+=cur;
if(sum==target){
//1.复制一下位置从pre到cur
int[] arr = new int[cur-pre+1];
for(int i=pre;i<=cur;i++){
arr[i-pre] = i;
}
list.add(arr);
//2.pre加一
pre = pre+1;
cur = pre;
sum = 0;
}else
if(sum>target){
pre =pre+1;
cur = pre;
sum = 0;
}else{
cur = cur+1;
}
}
return list.toArray(new int [list.size()][]);
}
}