和为S的连续正数序列
2020-03-02 本文已影响0人
youzhihua
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
示例:
输入:target = 9
输出:[[2,3,4],[4,5]]
思路
1.这道题可以使用“滑动窗口”+“双指针”的思想解决。
2.设置两个指针,这两个指针用于标识目前所属的范围。
- 当前范围内的和,可以通过等差数列的求和公式 sum=(low+high)(high-low+1)/2* 求出
- 当sum>target时,low指针右移
- 当sum<target时,high指针右移
- 当sum == target时,存下当前范围内的数字
- 当low >= high时,终止操作
Java代码实现
public class Solution {
public int[][] findContinuousSequence(int sum) {
ArrayList<int[]> res = new ArrayList<>();
int low = 1;
int high = 2;
while(low < high){
int cur = (low+high)*(high-low+1)/2;
if(cur == sum){
int[] array = new int[high-low+1];
for (int i = low; i <= high; i++) {
array[i-low] = i;
}
res.add(array);
low++;
high++;
}else if(cur > sum){
low++;
}else{
high++;
}
}
int[][] resArray = new int[res.size()][];
return res.toArray(resArray);
}
}
Golang代码实现
func findContinuousSequence(target int) [][]int {
res := make([][]int,0)
low,high := 1,2
for low < high{
cur := (low+high) * (high-low+1) / 2
if cur == target{
curSlice := make([]int,high-low+1)
for i:=low;i<=high;i++{
curSlice[i-low] = i
}
res = append(res, curSlice)
low++
high++
}else if cur < target{
high++
}else{
low++
}
}
return res
}