• 求最大子数组


    一.设计思想:

      通过一个for循环。数组分别从0-最大,1-最大-0 等等依次 到最大-最大-1,通过这样的方式达到循环数组的目的。然后在每一个的数字里面,从第一个数开始向后按顺序相加,当相加结果为负数的时候,则此时不满足构成最大子数组的条件,然后从导致数组为负数的数的下一个数开始向后相加。最后求得此情况下的最大子数组和。然后分别求出N个最大子数组的和,然后在进行比较大小,得出最终的最大子数组的和。

    二.出现的问题:

      起初并没有实现在一个首尾相接的数组中,最大子数组和为正确值,例如 1 -2 -3 6 5 正确结果为12 最后得出结果为11。

    三.问题的解决

       通过大for循环里面嵌套小循环,来实现的数组的循环问题。然后在每个小循环里面求出最大的子数组和。最后再比较大小来求出最大子数组的和。

    四.源代码:

    package maxs;
    import java.util.*;
    public class maxs {
        public static void main(String[] args){
            Scanner sc=new Scanner(System.in); 
            int num;
            System.out.println("请输入数组长度");
            num=sc.nextInt();
            int zif[]=new int[num];//分别的数组
            int neir[]=new int[num]; //数组里面的数
            int sum1[]=new int[num]; //最大值
            int d=sum1[0];
            System.out.println("请输入数组内容:");
            for(int i=0;i<num;i++)//输入num个数
            {
                neir[i]=sc.nextInt();
            }       
             for(int j=0;j<num;j++)   
            {
                for(int k=0;k<num;k++)   //分别从0-num 1-num-0 .....
                {
                    zif[k]=neir[(j+k)%num];
                }
                int sum=zif[0];//记录数组和
                int b=0;//进行记录
            
                for(int i=0;i<num;i++)
                {
                    if(b<0)
                    {
                        b=zif[i]; //b<0,b为加为负数那位的后一位
                    }
                    else
                    {
                        b+=zif[i];
                    }
                    if(sum<b)
                    {
                        sum=b; //sum为当前最大子数组的和
                    }
                    sum1[j]=sum;
                }
                if(d<sum1[j])
                {
                    d=sum1[j]; //得到最终的最大和
                }
            }
            System.out.print("最大子数组和为:");
            System.out.print(d);
        }
    }

    五.结果截图:

      

    六.总结:

      一个首尾相接的循环数组,可以在不同的位置起始。一个循环的数组可以分为从不同的位置开始。然后从第一个数,到最后一个数,每个数都当一次开始然后依次下去到结束。这样的N个数组凑起来就是一个首尾相接的循环数组。子数组的最大和则可以让开始的数开始向后面相加,当遇到结果为负数的时候,就不在满足条件了。应该从加的最后一个数的下一个数再开始进行相加。

      我的收获的就是:起初自己并没有思路,不知道怎么来实现他。然后想想老师说的剪断,那么不就是分别在第一个数后, 第二个数后,,,依次来当作断点吗?将复杂问题,分解,让问题明白了许多。

  • 相关阅读:
    vue--组件基础
    vue中的一些知识点--多看文档
    关于组件--React
    数组方法-->map()
    正则表达式使用
    border-image 和 border-color 不能同时使用问题
    gulp
    oninput 中文输入
    linux文档权限
    为什么使用 use strict
  • 原文地址:https://www.cnblogs.com/xieshiyu/p/6652997.html
Copyright © 2020-2023  润新知