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) { 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; } }
|
References
剑指 Offer 57 - II. 和为s的连续正数序列
一元二次方程 - 维基百科,自由的百科全书