• 整数数组中最大子数组的和


    一、实验题目

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

    二、实验要求

      输入一个一维整形数组,数组里有正数也有负数。
      一维数组首尾相接,象个一条首尾相接带子一样。
      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

    三、设计思想

      该实验大部分可以分为两部分:

        1、利用while循环录入用户想要输入的数组值,输入的是string类型,还得利用Integer.parseInt(String a),存入int数组,如果是"#"则结束循环录入(直接输入"#",则输出数组为空,无最大   值)。

        2、调用求最大值函数和的最大值,分为两部分:

          1、先求一个直线数组的连续和的最大值,算法复杂度为o(n),思想为:(1)如果a,b>0,则a+b肯定>a。(2)如果a,b>0,c<0,所以a+b+c肯定<a+b。(3)如果a<0,b>0,所以b肯  定大于a+b。所以当前一个数和小与零时,则赋值为零,再加下一个数,如果不是则与最大值比较,如果比最大值大,则更新最大值。当最后sum=0时,只有两种情况一个是数组中连续和最大值为0,另  一种就是所有数都小于零。

          2、求环的的连续和的最大值,即将最后一项的下一个为第一个数,即下标超出范围则减去数组的长度。利用for循环执行n次,遍历出最终的最大值,然后输出。

    四、出现的问题

      1、输入的时候,刚开始不能使用户自定义输入数组的值。

      2、在循环遍历n次时,衔接不正确。

    五、可能的解决方案(多选)

       列出所有的情况,求出和,选出最大的值输出。

    六、源代码

    import java.util.Scanner;
    
    public class Max 
    {
        public static void main(String[] args)
        {
            int shu[]=new int[100];
            int k=0;
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入若干个整数:");
            String a=scanner.next();
            if(a.equals("#")) System.out.println("您什么都没有输入,故没有最大值!");
            else
            {
                shu[k]=Integer.parseInt(a);
                k++;
                a=scanner.next();
                while(!a.equals("#"))
                {
                    shu[k]=Integer.parseInt(a);
                    k++;
                    a=scanner.next();
                }
                
                System.out.println("数组中连续数的最大值为:"+MaxSum(shu,k));
            }
        }
        
        static int MaxSum(int[] arr,int k) 
        {
            int Sum=0;
            int maxSum=0;
            int len=k;
            int d;
            int i;
            int j;
    
            for(j=0;j<len;j++)
            {
                for (i=j;i<len+j;i++) 
                {
                    if(i>len-1) d=i-len;
                    else d=i;
                    Sum+=arr[d];
                    if(Sum<0) 
                    {
                        Sum=0;
                    }
                    if(Sum>maxSum) 
                    {
                        maxSum=Sum;
                    }
                }
                Sum=0;
            }
    
            if(maxSum==0) 
            {
                for(i=0;i<len;i++) 
                {
                    if(i==0) 
                    {
                        maxSum=arr[i];
                    }
                    if(arr[i]>maxSum) 
                    {
                        maxSum=arr[i];
                    }
                }
            }
            
            return maxSum;
        }
    }

    七、结果截图

    八、总结

      此程序没有进行最终的优化,即环求数组值连续和的最大值的算法复杂度为o(n的平方),不是o(n)。

  • 相关阅读:
    无法卸载Visual Studio 2005,提示:"H:\vs\vs_setup.msi could not be opened"
    在两个DB的table之间同步数据
    用于标记系统是否需要重启动的注册表键值
    提高性能——存储过程最佳实践 [译自MSDN]
    几个常见的位运算问题
    [存档] 非递归后根遍历二叉树
    [存档] 用真值表设计非递归二叉树遍历算法
    补码
    卸载Google Chrome导致Outlook, Word不能打开超链接
    编程题: 将一个矩阵(二维数组)顺时针旋转90度
  • 原文地址:https://www.cnblogs.com/lizhaoxuan/p/6666435.html
Copyright © 2020-2023  润新知