一、题目及要求
1、输入一个整形数组,数组里有正数也有负数。
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为O(n)
二、思路
这道题我的思路是错的,后来在课上,听了其他两位同学的思路,大致理解了
大致思路如下:
1、首先不考虑数组第一个元素,从第二个元素开始,如果第二个元素加一个元素大于第二个元素,
那么将第二个元素值修改为更大的第一个元素加第二个元素的值,如果第二个元素加一个元素
小于第二个元素,则第二个元素值不变
2、依次类推,然后选出经过修改后的数组最大值,即为题目所求
三、源代码
package test1; import java.util.Scanner; public class Maxsum { public static void main(String[] args) { int a[] = new int [100]; @SuppressWarnings("resource") Scanner sc=new Scanner(System.in); System.out.println("请输入数组长度"); int len = sc.nextInt(); System.out.println("请输入数组元素"); for(int i=0;i<len;i++) { a[i] = sc.nextInt(); } int i=0; for(i=1;i<len;i++){ if(a[i]+a[i-1]>a[i]) { a[i]=a[i]+a[i-1]; } } int ans=-100000; for(i=0;i<len;i++) { if(ans<a[i]) { ans = a[i]; } } System.out.println("所有子数组的和的最大值为:"+ans); } }
四、运行截图
五、加入新条件
新条件:数组可以首尾相接,并在此基础上求最大子数组和
六、思路
1、如果首尾相接后,数组的最大子数组和原来一样,可以按照上面的方法去求
2、根据网上了解到的算法,如果首尾相接后有最大子数组和,那么这个数组一
定有最小子数组和,最大子数组和等于所有数组元素的和减去最小子数组和
七、源代码
package Test2; import java.util.Scanner; public class HuanMax { public static void main(String[] args) { int a[] = new int [100]; int b[] = new int [100]; int max = 0; int sum = 0; @SuppressWarnings("resource") Scanner sc=new Scanner(System.in); System.out.println("请输入数组长度"); int len = sc.nextInt(); System.out.println("请输入数组元素"); for(int i=0;i<len;i++) { a[i] = sc.nextInt(); b[i] = a[i]; } for(int i=0;i<len;i++) { sum=sum+a[i]; } // System.out.println(sum); int i=0; for(i=1;i<len;i++){ if(a[i]+a[i-1]>a[i]) { a[i]=a[i]+a[i-1]; } } int ans=-100000; for(i=0;i<len;i++) { if(ans<a[i]) { ans = a[i]; } } max=ans; for(i=1;i<len;i++){ if(b[i]+b[i-1]<b[i]) { b[i]=b[i]+b[i-1]; } } int ans1=100000; for(i=0;i<len;i++) { if(ans1>b[i]) { ans1 = b[i]; } } int min=ans1; int maxs= sum - min; if(maxs>max) { System.out.println("所有子数组的和的最大值为:"+maxs); }else { System.out.println("所有子数组的和的最大值为:"+max); } } }
八、运行测试
九、总结
总结一下,感觉自己Java语法好多已经忘记,而且对算法掌握的不多,以上两题都是在看了
别人的思路再自己编程出来的,感觉还是需要补一下算法的知识。