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

    一.设计思想

      首先最大子数组maxsum和开始位置值maxstart都是数组第一个元素,然后判断开始位置的值,如果maxstart小于0,则另maxstart等于0,然后maxstart在自身基础上加上下一个数组元素,再判断maxstart与maxsum的大小,若maxstart大于maxsum,则maxsum的值为maxstart,maxstart的值不变;以此递归,直至数组最后一个元素,最后maxsum的值就是这个数组中最大子数组的和。

    二.出现的问题

      1.刚开始没有记录开始位置的值,只是判断下一个值的正负,正的加,负的跳过,导致子数组不是连续的;

      2.换用了判断开始位置的值,正的则子数组和最大值再加上下一个数组元素,负的则子数组和最大值变成下一个数组元素的值,这次能解决刚开始的问题,但是出现了如果数组的最后一个元素为负的话,也会加到子数组和中,还有就是如果数组的元素全是负数,最后算出的结果就是最后一个元素。

    三.解决方案

      将最大子数组和与开始位置的值分别定义变量,让开始位置值参与循环,每次循环后更新最大子数组和的值,直到循环结束。

    四.源代码

    package 子数组;
    import java.util.Scanner;
    public class ArrayMax {
    
        public static void main(String[] args){
            int number,maxsum,maxstart;
            int i;
            Scanner in = new Scanner(System.in);
            System.out.println("请输入数组的大小:");
            number=in.nextInt();
            int array[]=new int[number];
            System.out.println("请输入数组的值:");
            for(i=0;i<number;i++)
            {
                array[i]=in.nextInt();
            }
            maxsum=array[0];
            maxstart=array[0];
            for(i=1;i<number;i++)
            {
                if(maxstart<0)
                {
                    maxstart=0;
                }
                maxstart+=array[i];
                if(maxstart>maxsum)
                    maxsum=maxstart;
                
            }
            System.out.println(maxsum);
            in.close();
        }
    }

    五.结果截图

    六.总结

      在考虑这个问题时,先不要一开始就考虑整体怎么样,先从一开始的元素考虑,然后逐步扩展,循环递归刚开始的情况就可以了。

  • 相关阅读:
    mysql数据库基本操作sql语言
    asp.net MVC4 表单
    asp.net MVC4 表单
    Mysql字符集设置
    zen Code 支持的代码样式
    sqlserver数据库标注为可疑的解决办法(转)
    SQL Server遍历表的几种方法
    GridView 动态添加绑定列和模板列
    TransactionScope 之分布式配置
    sql server 执行上100mb sql sql sql server 无法执行脚本 没有足够的内存继续执行
  • 原文地址:https://www.cnblogs.com/java-meng/p/5360265.html
Copyright © 2011-2022 走看看