返回一个整数数组中最大子数组的和
对于这个题目,我的第一想法是将所有的子数组都计算出来,然后取其中最大值。这个思路很简单,但是!题目限制了时间复杂度为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; } }
运行截图: