设计思想:
创建一个数组来存数,将整个数组中所有的正数和负数做好标记,从第一个数字开始想加,如果遇到正数就加上,如果遇到负数就比较,相减后再加上下一个正数大还是下一个正数大,将大的那个数作为最大数,一直遍历到数组结束,
至于循环数组,相当于将一个数组延长为两倍,加入一个判定条件,使得所有数的个数相加小于原来数组,其余的应该和第一个是差不多。
源代码:
import java.util.Scanner;public class Lianccc { public static void suan(int a[],int aaa) { int i,j = 0,max = a[0],aa=0,bb=0,zong=0; for( i=0;i=0) { aa=aa+a[i]; j=i; } if(a[i]<0) { bb=bb+a[i]; } zong=aa+bb; if (zong>=a[i]) { if(a[i]>0) max=zong; else max=max; } else { if(a[i]>=0) max=a[i];aa=max;bb=0; if(a[i]<0){ max=a[i]; } } } System.out.println("最大子数组是"+max);} public static void ssuan(int a[],int aaa) { int[] b=new int[aaa*2]; int i,j = 0,max = a[0],aa=0,bb=0,zong=0,pan=0; for(i=0;i aaa)pan++; if(b[i]>=0) { aa=aa+b[i]; j=i; } if(b[i]<0) { bb=bb+b[i]; } zong=aa+bb; if (zong>=b[i]) { if(b[i]>0) max=zong; else max=max;; } else { if(b[i]>=0) max=b[i];aa=max;bb=0;pan=0; if(b[i]<0){ max=a[i]; } } if(pan==3)break; } System.out.println("最大循环子数组是"+max);} public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); System.out.println("请输入元素个数"); int aaa=in.nextInt(); int aa[]=new int[aaa];//建立一个数组; System.out.println("请输入元素"); for (int i = 0; i < aaa; i++) { aa[i]=in.nextInt();//输入元素个数。 } suan(aa, aaa); ssuan(aa, aaa); }}
结果截图
总结:难点主要在于时间复杂度为n,只要第一个实现了,第二个循环很好实现,