Poison

剑指 Offer 57 - II. 和为s的连续正数序列

Math
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> resultList = new ArrayList<>();

for (int i = 1; i <= target / 2; i++) {
double j = (-1 + Math.sqrt(1 + 4 * (2L * target + ((long) i * i) - i))) / 2;
if (i < j && j == (int) j) { // 题目要求最少含有两个数且避免收集到 [j, i]
resultList.add(generateArray(i, (int) j));
}
}

return resultList.toArray(new int[0][]);
}

private int[] generateArray(int i, int j) {
int[] array = new int[j - i + 1];
for (int k = i; k <= j; k++) {
array[k - i] = k;
}
return array;
}
}
Sliding Window
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> resList = new ArrayList<>();

int mid = (target + 1) / 2;
int windowSum = 0;
int i = 1;
for (int j = 1; j <= mid; j++) {
windowSum += j;

while (windowSum >= target) {
if (windowSum == target) {
resList.add(generateArray(i, j));
}

windowSum -= i;
i++;
}
}

return resList.toArray(new int[0][]);
}

private int[] generateArray(int start, int end) {
int[] nums = new int[end - start + 1];
for (int i = start; i <= end; i++) {
nums[i - start] = i;
}
return nums;
}
}
Reference

剑指 Offer 57 - II. 和为s的连续正数序列
一元二次方程 - 维基百科,自由的百科全书