环形数组的最大子数组的和

题目要求:

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();
    }

}

结果截图:

原文地址:https://www.cnblogs.com/lhj1017/p/6641550.html