• java-四则运算-四


    题目要求:查找数组连成环形的和最大的连续子数组

    实验代码:

     1 package zuoYe;
     2 
     3 import java.util.Scanner;
     4 
     5 
     6 public class MaxSubArray {
     7     public static void main(String[] args) {
     8         Scanner scan = new Scanner(System.in);
     9         
    10         
    11         //输入数据
    12         System.out.println("请输入数组长度");
    13         int n = scan.nextInt();
    14         int[] a = new int[n];
    15         
    16         System.out.println("请输入数组元素");
    17         for(int i = 0;i < n;i++)
    18         {
    19             a[i] = scan.nextInt();
    20         }
    21         scan.close();
    22         //计算此数组的和最大的连续子数组
    23         int[] result = maxSub(a,a.length);
    24         System.out.println("不连接成环的和最大的连续子数组:");
    25         for(int i = result[0];i <= result[1];i++)
    26         {
    27             System.out.print(a[i] + "	");
    28         }
    29         System.out.println("和为:" + result[2]);
    30     
    31     
    32         
    33         
    34         //将此数组连成一个环,再计算此数组的和最大的连续子数组
    35         //连成一个环即将数组后再接上此数组,但是数组的最后一个元素不用接,相当于计算接上之后的数组的和最大子数组
    36         int[] b = new int[2 * n - 1];
    37         for(int i = 0;i < n - 1;i++)
    38         {
    39             b[i] = a[i];
    40             b[n + i] = a[i];
    41         }
    42         b[n - 1] = a[n - 1];
    43         int[] result2 = maxSub(b,n);
    44         System.out.println("
    
    将数组连成环后的和最大的连续子数组:");
    45         for(int i = result2[0];i <= result2[1];i++)
    46         {
    47             System.out.print(b[i] + "	");
    48         }
    49         System.out.println("和为:" + result2[2]);
    50 
    51         
    52     }
    53     
    54     
    55     
    56     
    57     //计算a数组的和最大的连续子数组(a数组为连成环后的等价数组,即原数组的二倍,n为原数组的长度)
    58     public static int[] maxSub(int[] a,int n)
    59     {
    60         int an = a.length;//连成环的等价数组的长度
    61         int currectSum = a[0];//记录当前累加和,初始值为a[0]
    62         int currectStartIndex = 0;//记录当前累加的起始下标,初始值为0
    63         int count = 1;//记录累加元素的个数,初始值为1
    64         int[] result = new int[3];//记录结果子数组的信息,
    65         result[0] = 0;//结果子数组的开始下标
    66         result[1] = 0;//结果子数组的结束下标
    67         result[2] = a[0];//结果子数组的和
    68         for(int i = 1;i < an;i++)//依次遍历a数组的每个元素
    69         {
    70             if(currectSum <= 0)//如果当前累加和不大于0,不大于0对后续的元素没有贡献,可以去掉了,所以应从a[i]处重新开始加
    71             {
    72                 currectSum = a[i];//将当前累加和赋值为a[i]
    73                 currectStartIndex = i;//将当前累加的开始下标赋值为i
    74                 count = 1;//将累加元素的个数记为1
    75             }
    76             else//当前累加和大于0,则继续加a[i]
    77             {
    78                 currectSum += a[i];
    79                 count++;//当前累加元素的个数加一
    80             }
    81             if(currectSum > result[2])//如果当前累加和大于原结果数组的累加和result[2],则应该将结果子数组信息更新为当前子数组,因为当前子数组的累加和大于结果子数组的和
    82             {
    83                 result[0] = currectStartIndex;//结果子数组的开始下标为当前子数组的开始下标
    84                 result[1] = i;//结果子数组的结束下标赋值为i
    85                 result[2] = currectSum;//结果子数组的累加和赋值为当前子数组的累加和
    86             }
    87             if(count >= n)//如果累加的元素个数等于原数组(未连成环的数组)的长度,则说明已经加了最多的元素,不能再加了,也就是说和最大的子数组即为原数组,应该结束循环
    88             {
    89                 break;
    90             }
    91         }
    92         return result;
    93     }
    94     
    95     
    96     
    97 }

    实验截图:

  • 相关阅读:
    ural(Timus) 1346. Intervals of Monotonicity
    SGU 223 Little Kings
    poj 1243 One Person
    poj 1185 炮兵布阵
    poj 1191 棋盘分割
    poj 1187 陨石的秘密
    ACMICPC Live Archive 2451 Brackets Sequence
    将时间格式的字符串转换成日期类型浏览器兼容解决方案
    asp.net项目发布容易忽略的debug=true
    使用微软的Ajax控件遇到的后台js提示语句不起作用的解决方案其一
  • 原文地址:https://www.cnblogs.com/ziyixuedie/p/6653942.html
Copyright © 2020-2023  润新知