目錄
題目及示例
輸入一個正整數 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
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
我的題解
//這個解法空間複雜度很小,但是時間複雜度稍高,因爲沒有利用規律,僅是使用滑動窗口
class Solution {
public int[][] findContinuousSequence(int target) {
int start = 1; //開始點,滑動窗口左邊界
int now = 1; //遊標,滑動窗口右邊界
int sum = 0;
List<int[]> list = new ArrayList<>();
while(start <= target/2){
while(sum < target){
sum += now;
++now;
}
if(sum == target){ //找到一組
int[] temp = new int[now - start];
for (int i = 0; i < temp.length; i++) {
temp[i] = start + i;
}
list.add(temp); //給result賦值 //start到now
start++; //start = now; //更新開始點
now = start; //更新遊標
sum = 0; //重置和
} else if(sum > target){ //開始點不對
start++; //start = now; //更新開始點
now = start; //更新遊標
sum = 0; //重置和
}
}
int[][] res = new int[list.size()][];
for (int i = 0; i < res.length; i++) {
res[i] = list.get(i);
}
return res;
}
}
滑動窗口結合數學規律
//若能發現公式xa+x*(x-1)/2=target,x表示每一個一維數組的個數
//時空複雜度大大降低
class Solution {
public int[][] findContinuousSequence(int target) {
int[][] array = new int[target/2][];
int num = 0;
for (int i = 0,x=2; i < target/2; x++) {
int ax = target - x*(x-1)/2;
if(ax <= 0)
break;
if(ax%x == 0){
num++;
int a = ax/x;
array[num-1] = new int[x];
for (int j = 0; j < x; j++) {
array[num-1][j] = a + j;
}
}
i++;
}
int[][] array1 = new int[num][];
for (int i = num-1,j = 0; i >= 0; i--,j++) {
array1[j] = array[i];
}
return array1;
}
}