zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和(三)--环形

      这次,在上次的要求中又多了一个条件 ——要求这个数组是环形的。

      在上次的基础上,将这个代码进行改进,得到以下结果。下面把代码贴出来。

      

     1 package yiweishuzu;
     2 
     3 import java.util.Scanner;
     4 
     5 public class shuzu_3 {
     6     private static Scanner scan;
     7 
     8     public static void main(String[] args) {
     9         // 确定元素的个数
    10         System.out.println("输入数组元素个数:");
    11         scan = new Scanner(System.in);
    12         int n = scan.nextInt();
    13 
    14         // 循环输入数组元素
    15         System.out.println("输入数组");
    16         int[] x = new int[n];
    17         for (int i = 0; i < n; i++) {
    18             x[i] = scan.nextInt();
    19         }
    20 
    21         int max = 0;
    22         int max1 = Integer.MIN_VALUE;
    23         int max2 = 0;
    24         int min = Integer.MAX_VALUE;
    25         int sum = 0;
    26         for (int i = 0; i < n; i++) {// 将一维数组总所有值相加
    27             max2 += x[i];
    28         }
    29         // System.out.println(max2);
    30         for (int i = 0; i < n; i++) {// 求一维数组中的最小字串
    31             if (sum >= 0) {
    32                 sum = x[i];
    33             } else {
    34                 sum += x[i];
    35             }
    36             if (sum < min) {
    37                 min = sum;
    38             }
    39         }
    40 
    41         // System.out.println(min);
    42         max = max2 - min;//得到最大环状字串的值
    43         
    44             System.out.println("最大子数组的和为:" + max);
    45     }
    46 }

      基本思路就是:先求出字符串中所有元素的和,然后再求出最小字串的值,就可以求出最大的字串的和了。

      因为在输入的字符串中,既有正数又有负数,所以在计算的过程中,所求的的最小的字串的和,就一定是环状中包含负数最多的字串,将这些包含最多的负数的字串减去,那么剩下的就一是包含正数最多的字串,在验证的过程中,就算是子串数全部都是正数,那也一定是比计算出来的值要小,所以,在环状的一维数组中,就一定是这样计算了。

      但是,在验证的过程中,有了这样的一些错误。因为在循环的过程中,最后一个元素不能再重新循环到他本身,所以,当只是不当做环状数组的时候,即正常一位数组时,就是当时我写的返回一个整数数组中最大子数组的和(一)中的情况,所以要进行分类讨论。

      改进后的代码如下:

     1 package yiweishuzu;
     2 
     3 import java.util.Scanner;
     4 
     5 public class shuzu_3 {
     6     private static Scanner scan;
     7 
     8     public static void main(String[] args) {
     9         // 确定元素的个数
    10         System.out.println("输入数组元素个数:");
    11         scan = new Scanner(System.in);
    12         int n = scan.nextInt();
    13 
    14         // 循环输入数组元素
    15         System.out.println("输入数组");
    16         int[] x = new int[n];
    17         for (int i = 0; i < n; i++) {
    18             x[i] = scan.nextInt();
    19         }
    20 
    21         int max = 0;
    22         int max1 = Integer.MIN_VALUE;
    23         int max2 = 0;
    24         int min = Integer.MAX_VALUE;
    25         int sum = 0;
    26         /*
    27          * 情况一 假设不看做环就可以求最大值
    28          */
    29         for (int i = 0; i < n; i++) {
    30             if (sum <= 0) {// 当遇到小于0的数时就停止相加
    31                 sum = x[i];
    32             } else {
    33                 sum = sum + x[i];
    34             }
    35             if (sum > max1) {
    36                 max1 = sum;
    37             }
    38         }
    39         // System.out.println(max1);
    40 
    41         /*
    42          * 情况二 假设必须变成环才可以
    43          */
    44         for (int i = 0; i < n; i++) {// 将一维数组总所有值相加
    45             max2 += x[i];
    46         }
    47         // System.out.println(max2);
    48         for (int i = 0; i < n; i++) {// 求一维数组中的最小字串
    49             if (sum >= 0) {
    50                 sum = x[i];
    51             } else {
    52                 sum += x[i];
    53             }
    54             if (sum < min) {
    55                 min = sum;
    56             }
    57         }
    58 
    59         // System.out.println(min);
    60         max = max2 - min;//得到最大环状字串的值
    61         if (max1 < max) {
    62             System.out.println("最大子数组的和为:" + max);
    63         } else {
    64             max = max1;
    65             System.out.println("最大子数组的和为:" + max);
    66         }
    67     }
    68 }

      

      在写的过程中,为了验证每一步是否是正确的,我有的就将循环后的结果进行输出,后来又将他们注释掉了。哈哈。

     实验截图:

      

      革命尚未成功,小子仍需努力!!!

  • 相关阅读:
    背水一战 Windows 10 (90)
    背水一战 Windows 10 (89)
    背水一战 Windows 10 (88)
    背水一战 Windows 10 (87)
    背水一战 Windows 10 (86)
    背水一战 Windows 10 (85)
    背水一战 Windows 10 (84)
    背水一战 Windows 10 (83)
    背水一战 Windows 10 (82)
    背水一战 Windows 10 (81)
  • 原文地址:https://www.cnblogs.com/yandashan666/p/10589002.html
Copyright © 2011-2022 走看看