设计思想:在原来最大数组的基础之上,将数组先扩展为原来的两倍就是将原来的数组复制然后连接到后面。再进行输入数字个数次循环,每次循环都扫描起点后输入数字个数个数字。计算数组和,并不断更新最大数组合
程序源代码:
package test; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.print("请输入数组长度:"); int l=in.nextInt();//用户输入数组长度 int[] shuzu =new int [l*2]; int number_hezuidazhi=0; System.out.println("请依次输入数字"); for(int i=0;i<l;i++) { shuzu[i]=in.nextInt(); shuzu[i+l]=shuzu[i]; } int number_he=shuzu[0]; for(int m=0;m<l;m++)//进行输入数字个数次循环 { for(int n=m;n<m+l;n++)//每次向后扫描输入数字个数的数字 { number_he = number_he + shuzu[n]; if(number_hezuidazhi<number_he)//如果数组和大于最大数组和,则更新 { number_hezuidazhi=number_he; } if(number_he<0)//如果数组和为小于零,那么抛弃从零开始 { number_he=0; } } number_he = 0;//一次循环更新一次数组和 } System.out.println("最大数组和为"+ number_hezuidazhi); in.close(); } }
结果截图:
结果分析:输入-1 2 3 -4 6
那么在这个首尾相连的数组中,应该是抛弃-4其他所有数字组成的集合最大。
程序中将数组变为-1 2 3 -4 6 -1 2 3 -4 6
第一次扫描(-1 2 3 -4 6 )-1 2 3 -4 6
第二次扫描 -1 (2 3 -4 6 -1) 2 3 -4 6
。。。。
每次都是上次最大数组的算法
总结:程序时间复杂度变成O(n*n);没有办法一次实现,就将数组变化进行多次遍历。