题目:
代码如下:
package day01; import java.util.Scanner; public class MaxArray { public static int max(int i,int j) { int m; if(i>j) m=i; else m=j; return m; } public static void main(String[] args) { // TODO 自动生成的方法存根 int i,n; int[] a = new int[100]; Scanner sc = new Scanner(System.in); //n个整数 n=sc.nextInt(); for(i=1;i<=n;i++) a[i]=sc.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]); //先把第一个子数组和赋值给ans,在与下一个子数组和比较哪个更大,将大的刷新赋给ans,依次循环 System.out.println(ans); sc.close(); } }
测试结果截图:
拓展:如数组为环型数组,求数组中最大子数组的和
要求:每个值只能取一次
代码如下:
package day01; import java.util.Scanner; public class FindMaxArray { public static void main(String[] args) { // TODO 自动生成的方法存根 int length;//定义数组长度length int n;//定义变化后的数组的长度 System.out.println("请输入数组元素个数"); Scanner sc = new Scanner(System.in); length=sc.nextInt(); n=2*length; int[] a = new int[n]; System.out.println("请输入数组中的元素:"); for(int i=0;i<length;i++) { a[i] = sc.nextInt(); } int max=a[0]; int s=0;//定义求和后的元素 for(int i=0;i<length;i++) { s=0; for(int j=i;j<length+i;j++) { s=s+a[j]; if(s>max) { max=s; } } a[length+i]=a[i]; //每次将已经计算过的数放到最后 } System.out.println("最大子数组的和为:"+max); sc.close(); } }
但是上面的解决方法与要求不服,数组中的值用了两次,及每次第i个值昨完判断后再赋值给length+i。所以现在还没有想到别的方法。