zoukankan      html  css  js  c++  java
  • 环形数组的最大子数组的和

    题目要求:

    1、输入一个一维整形数组,数组里有正数也有负数。

    2、一维数组首尾相接,象个一条首尾相接带子一样。

    3、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

    设计思想:首先定义数组和它的长度,输入数组,再定义一个数组,此数组的值为两个第一个数组的信息(用for循环进行数组信息的录入),再定义三个int类型的flag(保存暂时的和)和sum(保存最大值)还有s(用于控制开始位置和子数组的最大长度,不能高于第一个数组的长度)。运用for循环进行对flag的更新,如果flag>sum则sum进行更新,反之不更新。例子:如第一个数组为1 2 3 ;则第二个数组为1 2 3 1 2 3 。flag依次为1,1 2,1 2 3,2,2 3,2 3 1,3,3 1,3 1 2...,最终结果为6,子数组为1 2 3。

    出现的问题:(按例子)循环的时候总是跳过2开头的循环,后来知道if(s<Array.length)的时候是i=s-1,不是i=s,因为i=s之后i还会++。

    源代码:

    import java.util.Scanner;
    
    public class Sum2 {
    
        static void sum(int Array[])
        {
            int i,s=0;
            int sum=0,flag=0;
            //[1,-2,-3,4,9]
            int Array2[]=new int[2*Array.length];
            for(i=0;i<Array2.length;i++)
            {
                if(i!=Array.length)
                {
                    Array2[i] = Array[i];
                }
                
                if(i==Array.length)
                {
                    for(int z=0;z<Array.length;z++)
                    {
                        Array2[z+Array.length] = Array[z];
                        i++;
                    }
                }
            }
            //System.out.println("Array2:");s
            //for(i=0;i<Array2.length;i++)
            //System.out.println("Array2[i]);1 2 -3 5 -4 9
            /////////////////////////////////////////////////////////////
            for(i=s;i<Array.length+s;i++)
            {
                //System.out.println(i);
                flag=flag+Array2[i];
                
                if(flag>sum)
                    sum=flag;
                else
                    sum=sum+0;
                
                if(i==Array.length-1+s)
                {
                    s++;
                    if(s<Array.length)
                    {
                        i=s-1;
                        flag=0;
                    }
                    else
                        break;
                }
            }
            
            System.out.println("环形数组最大子数组的和:"+sum);
        }
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            int l,i;
            Scanner in =  new Scanner(System.in);
            System.out.print("请输入数组长度:");
            l=in.nextInt();
            int Arr[]=new int[l];
            System.out.print("请输入数组的值:");
            for(i=0;i<Arr.length;i++)
            {
                Arr[i] = in.nextInt();
            }
            sum(Arr);
            in.close();
        }
    
    }

    结果截图:

  • 相关阅读:
    转载文章:用.NET开发MSN聊天机器人 MSN聊天机器人开发揭秘
    ppc全屏程序(转)
    表设计中遇到的多对多的关系解决方案 (zt)
    using ZedGraph
    DataTable.Select(expression)
    你认识它吗?什么是QR码?
    分享《Windows Mobile平台应用与开发》源代码
    收藏信息
    六世喇嘛仓央嘉措诗集
    使用Axis开发Web Service程序
  • 原文地址:https://www.cnblogs.com/lhj1017/p/6641550.html
Copyright © 2011-2022 走看看