zoukankan      html  css  js  c++  java
  • 课堂练习--最大子数组和

    设计思想:

    1、setArray()函数实现数组的输入 此处定义数组长度为10

    2、ArrayMax()函数实现求最大子数组的和。应为复杂度为O(n),首先 输入一个数组 如:

     -1 2 -1 -2 5 4 3 -6 8 9 

    先定义一个新的数组cArray[],长度为11.然后初始化cArray[1]为0;for循环中 有

    cArray[i+1] = cArray[i]+array[i];

    所以新的数组为 :

    0 -1 2 1 -1...

    因为求最大值,所以判断当cArray[]小于0时,将5 赋值给新数组

    即为:

    0 -1 2 1 -1 5 9 12 6...

    最后在得到的新数组中求出最大的值 此时这个值为最大的子数组和。

    源代码:

     1 import java.util.Scanner;
     2 public class Array {
     3 
     4     public static void main(String[] args) {
     5         // TODO Auto-generated method stub
     6         Max m = new Max();
     7         m.setArray();
     8         m.ArrayMax();
     9     }
    10 
    11 }
    12 class Max
    13 {
    14     int array[];
    15     int cArray[];
    16     int max;
    17     int i;
    18     int m;
    19     void setArray()//输入数组
    20     {
    21         System.out.println("Please input your array length = 10");
    22         array = new int [10];
    23         Scanner s = new Scanner(System.in);
    24         for(int i=0;i<10;i++)
    25         {
    26             array[i]=s.nextInt();
    27         }
    28     }
    29 
    30     void ArrayMax()//输出最大值
    31     {
    32         cArray = new int [11];
    33         cArray[0] = 0;
    34         for(i=0;i<10;i++)
    35         {
    36             cArray[i+1] = cArray[i]+array[i];                    
    37             if(cArray[i+1]<0)
    38             {
    39                 cArray[i+2]=array[i+1];
    40             }
    41         }
    42         //在数组中得到最大值
    43         for(i=1;i<10;i++)
    44         {
    45             if(cArray[i+1]>=cArray[i])
    46             {
    47                 max = cArray[i+1];
    48             }
    49             else if(cArray[i+1]<cArray[i])
    50             {
    51                 m = cArray[i];
    52                 cArray[i]=cArray[i+1];
    53                 cArray[i+1]=m;
    54                 max = cArray[i+1];
    55             }
    56         }
    57         System.out.println("max is "+max);
    58     }
    59 }

    结果截图:

    总结:

    进行求最大值时,若大于0 相加则变大 反之变小。

  • 相关阅读:
    Zookeeper and The Infinite Zoo(CF1491D)(位运算)
    树上差分
    最近公共祖先
    极角排序
    最长路spfa
    树的基础
    树的遍历~
    最小圆覆盖板子
    动态凸包(询问点是否在凸包内部)
    凸包内最大三角形
  • 原文地址:https://www.cnblogs.com/hzxsg0919/p/5368897.html
Copyright © 2011-2022 走看看