LeetCode-面試題57.和爲s的連續正數序列
輸入一個正整數 target ,輸出所有和爲 target 的連續正整數序列(至少含有兩個數)。
序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。
示例 1:
輸入:target = 9
輸出:[[2,3,4],[4,5]]
示例 2:
輸入:target = 15
輸出:[[1,2,3,4,5],[4,5,6],[7,8]]
思路
利用滑動窗口的思想,我們基於target這個“數組”維護一個滑動窗口,窗口內的元素值的和與target進行比較。如果小於target,窗口向右擴大,如果大於target,窗口從左邊縮小,如果等於target,則將結果添加進結果集。
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> res=new ArrayList<int[]>();
//設置滑動窗口
int i=1;
int j=1;
int sum=0;
//i不會超過target/2
while(i<=target/2)
{
//窗口右移擴大
if(sum<target)
{
sum+=j;
j++;
}
//窗口縮小
else if(sum>target)
{
sum-=i;
i++;
}else
//計算窗口中數值的和
{
int[] tem=new int[j-i];
for(int m=i;m<j;m++)
{
tem[m-i]=m;
}
res.add(tem);
sum-=i;
i++;
}
}
return res.toArray(new int[res.size()][]);
}
}