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

    

     对于这个题目,我的第一想法是将所有的子数组都计算出来,然后取其中最大值。这个思路很简单,但是!题目限制了时间复杂度为O(n),而这个思路的时间复杂度为O(n²),所以需要更加简便的算法。

来分析一下题目,若想子数组的和最大,就要确保第i个数和第i+1个数的和要大于第i+1个数。如果将a[i]作为子数组的最后一位,满足第i-1位和第i位的和大于第i位就相加。if(a[i]+a[i-1]>a[i])  a[i]=a[i]+a[i-1];

呢么就能满足时间复杂度为O(n)。代码如下:

package test;

import java.util.Scanner;

public class Test {
    
    public static void main(String[] args) {
        
        @SuppressWarnings("resource")
        Scanner cin=new Scanner(System.in);
        int i,n;
        int[] a=new int[100];
        n=cin.nextInt();
        for(i=1;i<=n;i++)
            a[i] = cin.nextInt();
        for(i=2;i<=n;i++)
        {
            if(a[i]+a[i-1]>a[i])
                a[i]=a[i]+a[i-1];
        }
        int ans=-100000;
        for(i=1;i<=n;i++)
            ans=max(ans,a[i]);
        System.out.println(ans);
        
        
    }

    private static int max(int ans, int i) {
        if(ans>i)
        return ans;
        if(i>ans){
            return i;
        }
        return i;
    }

}

运行截图:

如果数组是循环数组呢,时间复杂度为O(n)的我暂时没想出来。不过其他方法倒是可行,比如将所有的子数组的和计算出来取最大值。

package test;
import java.util.Scanner;
public class Test2 {
 public static void main(String args[]) {

     System.out.println("输入数字个数");
     Scanner cin= new Scanner(System.in);
     int n = cin.nextInt();
     int[] a=new int[2*n];
     System.out.println("输入数值");
     for(int i = 0;i < n;i++) {
      a[i] = cin.nextInt();
     }
     for(int i = n;i < n*2; i++) {
      a[i] = a[i-n];
     }
     for(int i=2;i<=n;i++)
        {
            if(a[i]+a[i-1]>a[i])
                a[i]=a[i]+a[i-1];
        }
        int ans=-100000;
        for(int i=1;i<=n;i++)
            ans=max(ans,a[i]);
        System.out.println(ans);

 }
    private static int max(int ans, int i) {
        if(ans>i)
        return ans;
        if(i>ans){
            return i;
        }
        return i;
    }
}

运行截图:

原文地址:https://www.cnblogs.com/wendi/p/12369275.html