第 34 日:和为s的连续正数序列
题目链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/
题目
解题
-
双指针
解题思路:
1.使用双针表示连续序列的边界,创建list数组容器存放int[]结果
2.如果范围内总和等于target,存放到容器中
借用K神的一张图:
详细代码如下:
public int[][] findContinuousSequence(int target) {
int l=1,r=2;
List<int[]> arr=new ArrayList<int[]>();
while(r<=1+target/2){
int num=sum(l,r);
if(num==target){
int[] is=new int[r-l+1];
for(int i=0,h=l;h<=r;h++,i++){
is[i]=h;
}
arr.add(is);
l++;
r++;
}else if(num<target){
r++;
}else{
l++;
}
}
int[][] res=new int[arr.size()][];
for(int i=0;i<res.length;i++){
res[i]=arr.get(i);
}
return res;
}
//左右边界求和
int sum(int l,int r){
int x=l-r;
if(x%2==0){
return (l+r)*(r-l)/2+(l+r)/2;
}else{
return (l+r)*(r-l+1)/2;
}
}
-
对第1种方法的优化
解题思路:
上一种方法我们每次需要重复计算num,很浪费开销,由于我们的指针是一个个位置进行挪动的,所以我们只用在原num上+i
或-i
即可详细代码如下:
public int[][] findContinuousSequence(int target) {
int l = 1, r = 2, num = 3;
List<int[]> res = new ArrayList<>();
while(l < r) {
if(num == target) {
int[] ans = new int[r - l + 1];
for(int k = l; k <= r; k++)
ans[k - l] = k;
res.add(ans);
}
if(num >= target) {
num -= l;
l++;
} else {
r++;
num += r;
}
}
return res.toArray(new int[0][]);
}