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

一:返回一个整数数组中最大数组的和,首尾不可以相连,即非环状数组

要求:输入一个整形的数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n);

import java.util.Scanner;

public class array {

    public static void main(String[] args) {
        
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入数字的数量:");
        int n=scanner.nextInt();//输入数组的个数
        int[] a=new int[n];
        System.out.println("请输入数组的数值:");
        for(int i=0;i<n;i++)
        {//循环输入数组的值
            a[i]=scanner.nextInt();
        }
        for(int i=1;i<n;i++)
        {
            if(a[i]+a[i-1]>a[i])
                a[i]=a[i]+a[i-1];
        }
        
        int ans=-1000;
        for(int i=0;i<n;i++)
        {
            if(a[i]>ans)
                ans=a[i];//找取最大值
        }
        System.out.println(ans);
    }

}

二:返回一个整数数组中最大数组的和,首尾可以相连,即环形数组

1.在第一种的非环形数组的动态规划思想的基础上,要想可以循环,可以将一个n容量的数据,根据数字的开头选择可以转换成n种不同的数组

   例如:数组  1 2 3 4    可以转换成不同的2 3 4 1        3 4 1 2      4 1 2 3

2.然后运用非环形的思路,计算出各个子数组之和的最大值

3.找出步骤2中的最大值即可

import java.util.Scanner;

public class array {

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入数字的数量:");
        int n=scanner.nextInt();//输入数组的个数
        int[] a=new int[n];
        System.out.println("请输入数组的数值:");
        int m=-1000000;
        
        for(int i=0;i<n;i++) {
              a[i]=scanner.nextInt();
          }
        
      for(int i=1;i<=n;i++) 
      {
          int[] b=new int[n];
          for(int j=0;j<n;j++)
          {
              b[j]=a[(i+j)%n];//让不同的数组开头,形成不同的字符数组
          }
          m=max(arraymax(b,n),m);
      }
      
      System.out.println(m);
    }
    
    
       public static int arraymax(int[] a,int count)
       {
              for(int i=1;i<count;i++)
                  {
                      if(a[i]+a[i-1]>a[i])
                      a[i]=a[i]+a[i-1];
                  }
        int ans=-10000;
        for(int i=0;i<count;i++)
        {
           ans=max(ans,a[i]);
        }
        return ans;
      }
       
       
       
       public static int max(int ans,int i)
       {//计算两者的最大值
           if(ans>i)
               return ans;
           else
               return i;
       }
    }

原文地址:https://www.cnblogs.com/1234yyf/p/12378011.html