题目
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
代码实现
双指针
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();
int left = 1,right = 2;
int total = left + right;
while (left < right){
if(total == target){
int[] temp = new int[right - left + 1];
for (int i = left; i <= right; i++) {
temp[i - left] = i;
}
list.add(temp);
}
if(total > target){
total-=left;
left++;
}else {//total < target
right++;
total+=right;
}
}
return list.toArray(new int[0][]);
}
}
求和公式
K神代码
class Solution {
public int[][] findContinuousSequence(int target) {
int i = 1;
double j = 2.0;
List<int[]> res = new ArrayList<>();
while(i < j) {
j = (-1 + Math.sqrt(1 + 4 * (2 * target + (long) i * i - i))) / 2;
if(i < j && j == (int)j) {
int[] ans = new int[(int)j - i + 1];
for(int k = i; k <= (int)j; k++)
ans[k - i] = k;
res.add(ans);
}
i++;
}
return res.toArray(new int[0][]);
}
}