• 课堂测试-求子数组和最大值


    设计思想:

    1.首先设数组中的第一个数为最大值,循环从0开始,和相邻的数相加;

    2.若得到的和大于最大值,则将和的值赋给最大值;

    3.若得到的和小于0,则将和赋为0,相当于从下一个数开始下一次循环;若最大值小于当前值,则将当前值赋给最大值,以保证全为负数时的正确。

    出现的问题:

    最后求得的最大值没有计算负数,如 5 -1 3,得到的是8

    解决方案:

    令数组第一个数为最大值,循环从0开始,即可解决问题。

    源代码:

    import java.util.Scanner;
    public class Test2 {
      public static void main(String[] args){
          int N=5;
          int list[]=new int [N];
          //创建一个新数组
          Scanner in=new Scanner(System.in);
          int i;
          System.out.println("请输入数组:");
          for(i=0;i<N;i++)
          {
              list[i]=in.nextInt();
          }
          max_ l=new max_();
          System.out.print("子数组最大的和为:  "+l.max_(list,N));
          //调用函数
          in.close();
      }
    }
    class max_
    {
        int max_(int list[],int length)
        {
            int i;
            int lmax=0;
            int max=list[0];
            //设最大值为list[0]
            for(i=0;i<length;i++)
            {
                lmax+=list[i];
                if(lmax>max||lmax==max)
                {
                    max=lmax;
                }
                if(lmax<0)//若小于0,则从后一个数开始加和
                {
                    lmax=0;
                    if(max<list[i]||max==list[i])
                    {
                        max=list[i];
                    }
                }
                //若数组全为负数,求最大值
            }
            return max;
        }
    }

    结果截图:

     

    总结:

        求子数组的和的最大值,首先要理解清楚子数组的概念;只能是相邻数之间组成。逻辑要更清楚一些,我添加了只有负数时的情况。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    centos7-根据端口号查看所属应用
    centos7-网络与防火墙常用命令
    docker(5)常用命令
    docker(4)使用Dockerfile文件创建镜像-对docker(3)的改进
    [多校联考2021] 模拟赛4
    [省选前集训2021] 模拟赛7
    [多校联考2021] 模拟赛3
    [学习笔记] 圆方树
    [多校联考2021] 模拟赛2
    [学习笔记] 反悔贪心
  • 原文地址:https://www.cnblogs.com/yyting/p/5359462.html
Copyright © 2020-2023  润新知