Java中遞增序列和為n是一個經典的問題,一般可以使用雙指針或動態規劃解決。下面分別介紹這兩種解法。
雙指針解法
public int[] findContinuousSequence(int target) { List>res = new ArrayList<>(); int i = 1, j = 2, sum = 3; while (i< j) { if (sum == target) { List
list = new ArrayList<>(); for (int k = i; k<= j; k++) { list.add(k); } res.add(list); sum -= i; i++; } else if (sum< target) { j++; sum += j; } else { sum -= i; i++; } } int[][] ans = new int[res.size()][]; for (int k = 0; k< res.size(); k++) { ans[k] = res.get(k).stream().mapToInt(value ->value).toArray(); } return ans; }
動態規劃解法
public int[] findContinuousSequence(int target) { List>res = new ArrayList<>(); for (int i = 1; i<= target / 2; i++) { int sum = i; List
list = new ArrayList<>(); list.add(i); for (int j = i + 1; j<= target / 2 + 1; j++) { if (sum + j >target) { break; } sum += j; list.add(j); if (sum == target) { res.add(list); break; } } } int[][] ans = new int[res.size()][]; for (int i = 0; i< res.size(); i++) { ans[i] = res.get(i).stream().mapToInt(value ->value).toArray(); } return ans; }