课堂练习(一个环的最大子数组)
题目:返回一个一维整数数组中最大子数组的和。
要求:
输入一个一维整形数组,数组里有正数也有负数。
一维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
1》设计思想:
主要是在上一次的基础之上进行改进,这次是要进行一个环的最大子数组,所以说我的思路就是把这个环所有的数组情况都
复制另一个数组,每次将数组的数向后移一位,最后一位移到第一位,每次数组都求出一个最大值,然后比较最大值中的最大数,
他就是环的最大值。
其中的求最大子数组参见:http://www.cnblogs.com/sz20142898/p/5364141.html
2》源代码:
1 import java.util.*; 2 /* 3 求最大子数组问题 4 要求数组中有正也有负数,如果全为负数,只需要找出 5 最大的负数即可。 6 */ 7 public class Shuzuhe { 8 public static void main(String[] args){ 9 Scanner sc=new Scanner(System.in); //可以读出输入的数 10 int L; 11 System.out.println("请输入数组长度"); 12 L=sc.nextInt(); 13 int a[]=new int[L];//定义一个长为L 的数组,作为输入数组 14 int c[]=new int[L]; 15 int sum1[]=new int[L]; 16 int d=sum1[0]; 17 System.out.println("请输入要进行处理的数(L个):"); 18 for(int i=0;i<L;i++)//输入L个数 19 { 20 c[i]=sc.nextInt(); 21 } 22 23 24 25 for(int j=0;j<L;j++) 26 { 27 for(int k=0;k<L;k++) 28 { 29 a[k]=c[(j+k)%L]; 30 } 31 int sum=a[0];//用于记录和 32 int b=0;//用于每次运算,找最大子数组 33 34 for(int i=0;i<L;i++) 35 { 36 if(b<0) 37 { 38 b=a[i]; //如果b<0,将b移到加为负数那位的后一位 39 } 40 else 41 { 42 b+=a[i]; 43 } 44 if(sum<b) 45 { 46 sum=b; //sum为当前最大子数组的和 47 } 48 sum1[j]=sum; 49 } 50 if(d<sum1[j]) 51 { 52 d=sum1[j]; 53 } 54 } 55 System.out.print("最大子数组和为:"); 56 System.out.print(d); 57 } 58 }
3》结果截图:
4》结对情况
我(孙哲)负责代码复审和代码测试,李营程序分析,代码编程,刚开始的时候设计思路存在问题,后来经过讨论确定正确的思路,
并最终解决问题。
5》开发照片