1.题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
Good Luck!
2.算法描述
方法:双指针+滑动窗口。需要求的和是一个公差为1的等差数列的和。
1.
声
明
两
个
指
针
l
o
w
,
h
i
g
h
分
别
等
于
1
,
2
。
\red{声明两个指针low,high分别等于1,2。}
声明两个指针low,high分别等于1,2。(题目要求至少为2个正数的和)
2.以
l
o
w
−
h
i
g
h
为
等
差
数
列
求
和
等
于
c
u
r
_
s
u
m
:
(
h
i
g
h
+
l
o
w
)
∗
(
h
i
g
h
−
l
o
w
+
1
)
/
2
。
\red{low-high为等差数列求和等于cur\_sum:(high+low)*(high-low+1)/2。}
low−high为等差数列求和等于cur_sum:(high+low)∗(high−low+1)/2。
3.将cur_sum与sum作比较:
如果
c
u
r
_
s
u
m
=
=
s
u
m
\red{cur\_sum == sum}
cur_sum==sum:找到了一个满足连续正整数序列的和,然后将low自增1(high自增会超出sum)
如果
c
u
r
_
s
u
m
<
s
u
m
\red{cur\_sum < sum}
cur_sum<sum:high自增1;
如果
c
u
r
_
s
u
m
>
s
u
m
\red{cur\_sum > sum}
cur_sum>sum:low自增1;
3.代码描述
3.1.Java代码
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
int low = 1, high = 2;
while(high>low){
int curSum = (low+high)*(high-low+1)/2;
if(curSum == sum){
ArrayList<Integer> subAns = new ArrayList<>();
for(int i=low;i<=high;i++)
subAns.add(i);
ans.add(subAns);
low++;
}
else if(curSum < sum){
high++;
}
else{
low++;
}
}
return ans;
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
class Solution:
def FindContinuousSequence(self, tsum):
ans = []
low = 1
high = 2
while high>low:
cur_sum = (low+high)*(high-low+1)/2
if cur_sum == tsum:
ans.append(list(range(low,high+1)))
low += 1
elif cur_sum < tsum:
high += 1
else:
low += 1
return ans