输入一个正整数target,输出所有和为target的连续正整数序列(至少含有两个数)。序列内的数字从小到大排列,不同序列按照收割数字从小到大排列。
方法一:暴力破解法
时间复杂度:O(target根号target)
空间复杂度:O(1)
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();
int sum = 0;
for(int i = 1; i <= (target - 1)/2; i++){
for(int j = i; j <= (target + 1)/2; j++){
sum += j;
if(sum > target){
//每次退出循环前需要将sum归0
sum = 0;
break;
}
if(sum == target){
int[] array = new int[j - i + 1];
for(int k = i; k <= j; k++){
array[k - i] = k;
}
list.add(array);
sum = 0;
break;
}
}
}
return list.toArray(new int[list.size()][]);
}
}
方法二:双指针
时间复杂度:O(target)
空间复杂度:O(1)
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();
int sum = 0;
for(int l = 1, r = 2; l < r; ){
sum = (l + r) * (r - l + 1) / 2;
if(sum > target){
l++;
}
else if(target == sum){
int[] arr = new int[r - l + 1];
for(int i = l; i <= r; i++){
arr[i - l] = i;
}
list.add(arr);
l++;
}
else r++;
}
return list.toArray(new int[list.size()][]);
}
}