面試題57 -II.和爲s的連續整數序列
題目描述
輸入一個正整數 target ,輸出所有和爲 target 的連續正整數序列(至少含有兩個數)。
序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。
示例 1:
輸入:target = 9
輸出:[[2,3,4],[4,5]]
示例 2:
輸入:target = 15
輸出:[[1,2,3,4,5],[4,5,6],[7,8]]
限制:
1 <= target <= 10^5
題解
這裏考慮使用雙指針:(目標數組由集合接收)
當兩指針之間的數的和比目標值小時,快指針加一,並將和加上快指針指的數;
當兩指針之間的數的和比目標值大時,先減去慢指針指的數,再將慢指針加一;
當和正好是目標值的時候,將快慢指針間的數入數組並放入集合,並將慢指針加一,繼續查找;
很容易想到,當慢指針指到目標值的一半後即可跳出循環;
代碼如下:
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();
//定義快慢指針,界限值以及和
int slow = 1;
int fast = 2;
int max = target/2+1;
int sum = 3;
//慢指針超過界限跳出循環
while(slow<=max){
//當兩指針之間的數的和比目標值小時,快指針加一,並將和加上快指針指的數;
if(sum<target){
fast++;
sum+=fast;
// 當兩指針之間的數的和比目標值大時,先減去慢指針指的數,再將慢指針加一;
}else if(sum>target){
sum-=slow;
slow++;
}else{
// 當和正好是目標值的時候,將快慢指針間的數入數組並放入集合,並將慢指針加一,繼續查找;
int[] arr = new int[fast-slow+1];
for(int x = slow,y = 0;x<=fast;x++,y++){
arr[y] = x;
}
list.add(arr);
sum-=slow;
slow++;
}
}
// toArray()方法:以正確的順序(從第一個到最後一個元素)返回一個包含此列表中所有元素的數組。
return list.toArray(new int[0][]);
}
}