题目描述:
解析:
看到这个题目,我想到的办法是i从1开始遍历到mid=(sum+1)/2,每次求i开始直到mid的和,中间找到和为sum的就存到结果res中。但是这个效率太低,每次都要遍历i到mid次。
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(sum < 3)
return res;
int mid = sum / 2 + 1;
for(int i = 1; i < mid; i++){
ArrayList<Integer> cur = new ArrayList<Integer>();
int tmp = 0;
for(int j = i; j <= mid; j++){
tmp += j;
cur.add(j);
if(tmp == sum){
res.add(cur);
break;
}
}
}
return res;
}
}
从网上看到了看大家的解法,基本都是设置一个small和一个big,表示连续序列的最小最大值,然后与sum比较,curSum比sum大,则增大small,curSum比sum小,则增加big。
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(sum < 3)
return res;
int mid = (sum + 1) / 2;
int small = 1;
int big = 2;
int curSum = big + small;
while(small < mid){
while(small < mid && curSum > sum){
curSum -= small;
small++;
}
if(curSum == sum){
ArrayList<Integer> cur = new ArrayList<Integer>();
for(int j = small; j <= big; j++){
cur.add(j);
}
res.add(cur);
}
big++;
curSum += big;
}
return res;
}
}