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

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 }

 

 

 

 
posted @ 2021-05-21 10:49  抚琴尘世客  阅读(44)  评论(0编辑  收藏  举报