zoukankan      html  css  js  c++  java
  • 剑指 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 }

     

     
  • 相关阅读:
    类BufferedImage
    Fileltem
    文件上传api——MultipartFile
    热插播 devtools
    生成banner
    maven 配置
    配置java环境变量
    u盘如何恢复存储量
    四则运算
    PM
  • 原文地址:https://www.cnblogs.com/haifwu/p/14792829.html
Copyright © 2011-2022 走看看