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

    结果截图:

  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/lhj1017/p/6641550.html
Copyright © 2011-2022 走看看