zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和。

    题目:返回一个整数数组中最大子数组的和。

     

    要求: 输入一个整型数组,数组里有正数也有负数;

              数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;

              求所有子数组的和的最大值。要求时间复杂度为O(n);

    一、设计思想

    1.首先随机产生一个数组,数组长度可自行输入,该数组里有正数也有负数。

    2.从数组中第一个元素a[0]开始,依次计算a[0]、a[0]+a[1]、a[0]+a[1]+...+a[i]的值,即从a[0]开始的每个子数组的和,取出最大值。

    3.再从数组第二个元素a[1]开始,依次往后计算每个子数组的和,取出最大值。

    4.依次循环,循环num次,直到数组最后一个元素,将每次求得的最大值存到一个数组list[]中。

    5.比较每次得出的子数组的和的最大值,再得出最大值。

    二、源程序

     1 //作者:王雪青   陆宇

     2 //日期:2015年3月18日

     3 package com.java.lianxi;

     4

     5 import java.util.*;

     6 public class lianxi2

     7 {

     8     public static void main(String[] args)

     9     {

    10         Scanner input=new Scanner(System.in);

    11         System.out.print("请输入数组中数的个数:");

    12         int num=input.nextInt();

    13         int array[]=new int[num];

    14         for(int i=0;i<num;i++)

    15         {

    16             if((int)(Math.random()*2)==0)

    17             {

    18                 array[i]=(int)(Math.random()*10);

    19             }

    20             else

    21             {

    22                 array[i]=-(int)(Math.random()*10);

    23             }

    24         }

    25         for(int i=0;i<num;i++)

    26         {

    27             System.out.println(array[i]);

    28         }

    29         int max=0;

    30         int list[]=new int[num];

    31         for(int j=0;j<num;j++)

    32         {

    33             max=array[j];

    34             int sum=0;

    35             for(int t=j;t<num;t++)

    36             {

    37                 sum=sum+array[t];

    38                 if(sum>max)

    39                 {

    40                     max=sum;

    41                 }

    42             }

    43             list[j]=max;

    44         }

    45         for(int i=0;i<num;i++)

    46         {

    47             System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");

    48             System.out.println(list[i]);

    49         }

    50         for(int i=1;i<num;i++)

    51         {

    52             max=list[0];

    53             if(list[i]>max)

    54             {

    55                 max=list[i];

    56             }

    57         }

    58         System.out.print("子数组和的最大值为:"+max);

    59     }

    60 }

    61    

    三、运行结果截图:

  • 相关阅读:
    photoshop--图像大小(分辨率和宽高)
    Arduino--单向倾斜开关
    禁止google浏览器http链接强制跳转为https
    属性缓存_使用ConcurrentDictionary替代Hashtable对多线程的对象缓存处理
    .Net(windows服务器)清理缓存数据的几个方法
    【西天取经】(升级.net5)用了一整天才把项目从.netcoreapp3.1升级到.net5(转载)
    在Debian 9 vim中启用鼠标复制粘贴
    将数据批量插入SQL Server
    shell 脚本中 在grep -E '($wo|$ni|$ta)' 这里面用变量
    kubernetes 重启的几种方法
  • 原文地址:https://www.cnblogs.com/zhaochenguang/p/8299246.html
Copyright © 2011-2022 走看看