设计思想:
首先解决一个前后不连接数组,之后在重复循环从第二到最后再到第一,以此类推到所有可能性;求最大子数组和是要先赋予一个MAX值与是否加后面的一个数进行比较,大则重新赋值;反之则停止加和。
如果前后数全为负数,则直接找出数组中最大数即可。
写程序中出现的问题:
要求在O(n)的情况下进行求和,必须分析清晰,之后数组连续如果连续出现负数正数会影响思考。
源代码:
package ceshi; import java.util.*; public class shi { public static int Max(int a,int b){ if(a<b)return b; else return a; } public static int zumax(int a[],int n){ int Max=0; boolean p=false; for(int i=0;i<n;i++){ if(a[i]>=0){ p=true; break; } } if(p==false){ Max=a[0]; for(int i=0;i<n;i++){ if(a[i]>Max){ Max=a[i]; } } } else{ int i; int C=0; for(i=0;i<n;i++){ C+=a[i]; if(C>Max){ Max=C; } if(C<0){ C=0; } } } return Max; } public static int huan(int a[],int n){ int b[]=new int[(2*n)]; int Max2=0; boolean p=false; for(int y=0;y<n;y++){ if(a[y]>=0){ p=true; break; } } if(p==false){ Max2=a[0]; for(int y=0;y<n;y++){ if(a[y]>Max2){ Max2=a[y]; } } } else{ for(int i=0;i<n;i++){ b[i]=a[i]; b[i+n]=a[i]; } int c[]=new int[n]; for(int i=0;i<n;i++){ for(int y=0;y<n;y++){ c[y]=b[i+y]; } if(Max2<zumax(c,n)){ Max2=zumax(c,n); } } } return Max2; } public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println("输入数组内数量:"); int nn=input.nextInt(); int aa[]=new int[nn]; System.out.println("输入数:"); for(int i=0;i<nn;i++){ aa[i]=input.nextInt(); } System.out.println("环状数组最大子数组为"+huan(aa,nn)); } }
输出结果:
总结:
这次写程序更多的是在思路上的困难,感觉到了以后写代码不只是单单的码词,一个简单正确的思路能够剩下不少时间,这个代码最主要是在环状数组它在重新“切开”之后就个 刚开始的时候不一样,需要重新求最大子数组之和。还有就是O(n)的限定,让代码不能老是for套着for结构,需要理清思路,一次成功。
所有评论(0)