1. 题目:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 事例:
输入:target = 9
输出:[[2,3,4],[4,5]]
3. Code:
1 public class FindContinuousSequence { 2 public int[][] findContinuousSequenceA(int target) { 3 /** 4 * @Method: findContinuousSequence 5 * @Author: haifwu 6 * @Version: 1.0 7 * @Date: 21/05/2021 10:25 8 * @param target 9 * @Return: java.util.List<java.util.List<java.lang.Integer>> 10 * @Description: 枚举 + 暴力 11 * 12 */ 13 List<int[]> list = new ArrayList<>(); 14 15 int n = target / 2 + 1; // 下取整 16 for(int i = 1; i < n; i ++) { 17 int sum = i, t = i + 1; 18 while(sum < target && t <= n) { 19 sum += t; 20 if (sum == target) { 21 int[] temp = new int[t - i + 1]; 22 for(int k = i; k <= t; ++k) { 23 temp[k - i] = k; 24 } 25 list.add(temp); 26 break; 27 } 28 t++; 29 } 30 } 31 return list.toArray(new int[list.size()][]); 32 } 33 34 35 public int[][] findContinuousSequenceB(int target) { 36 /** 37 * @Method: findContinuousSequence 38 * @Author: haifwu 39 * @Version: 1.0 40 * @Date: 21/05/2021 10:25 41 * @param target 42 * @Return: java.util.List<java.util.List<java.lang.Integer>> 43 * @Description: 滑动窗口或双指针 44 * 45 */ 46 List<int[]> list = new ArrayList<>(); 47 int n = target / 2 + 1; 48 int sum = 0; 49 for (int l = 1, r = 1; l < n;) { 50 if(sum < target) { // 有边界向右移动 51 sum += r; 52 r++; 53 } else if (sum > target) { // 左边界向右移动 54 sum -= l; 55 l++; 56 } else { // 满足条件,存储 57 int[] temp = new int[r - l]; 58 for(int i = l; i < r; i++) { 59 temp[i - l] = i; 60 } 61 list.add(temp); 62 // 左边界向右移动 63 sum -= l; 64 l++; 65 } 66 } 67 return list.toArray(new int[list.size()][]); 68 } 69 70 public static void main(String[] args) { 71 Scanner scanner = new Scanner(System.in); 72 int target = scanner.nextInt(); 73 int[][] list = new FindContinuousSequence().findContinuousSequenceB(target); 74 int n = list.length; 75 for (int i = 0; i < n; i++) { 76 int m = list[i].length; 77 for (int j = 0; j < m; j++) { 78 System.out.print(list[i][j] + " "); 79 } 80 System.out.println(); 81 } 82 } 83 }