结对者:王宏伟
设计思路:为了实现数组的首尾相连接,则把数组写入两遍,即a[0],a[1],a[2],a[3],a[0],a[1],a[2],a[3]。求子数组最大值从第一个开始遍历到最后一个结束,依次往复向后推进求出子数组的最大值。
源代码:
//课堂测试 //范亚雷 2016.04.11 //import javax.swing.JOptionPane; import java.util.*; class Maxout{ int[] list=new int[100]; int carmax=0; int max; int length; Maxout(){} public void Input(){ System.out.println("请输入数组的长度:"); Scanner a=new Scanner(System.in); length=a.nextInt(); if(length==0||length<0) //数组长度为0,报错 {System.exit(0);} Scanner sca=new Scanner(System.in); System.out.println("请依次数组内的数:"); //输入 for(int i=0;i<length;i++) { list[i]=sca.nextInt(); list[i+length]=list[i]; //把数组连续写入两次,以实现首尾连接 } max=list[0]; //System.out.println(max); } public void Largest(){ //求最大子数组和 int start=0;int end=0; for(int j=0;j<length*2;j++){ for(int i=j;i<j+length;i++){ if(carmax>=0) { carmax=carmax+list[i]; } else { carmax=list[i]; start=i; } if(max<carmax) { max=carmax; end=i; } } carmax=0; } System.out.println("环子数组的和最大为为:" + max); //输出max } } public class OutMax { public static void main(String[] args){ Maxout m=new Maxout(); m.Input(); m.Largest(); } }
运行截图:
总结:此次编程浪费了很长的时间,主要是想是想让时间复杂度为最小并且不是转换为求子数组的最小值的解决思路。所以一开始试了很长时间但都没有写成,最终还是选择用复杂的时间复杂度,简单的思路写成了这个程序。