2020年2月25日课堂小测随笔
一、题目
二、源程序代码
package test; import java.util.*; public class Array { public static void main(String []args) { int [] A= {1,-2,3,5,6}; int max=0; int a,b; b=getCount(A)-getMin(A); a=getMax(A); if(a>b) { System.out.println(a); }else { System.out.println(b); } } public static int getMax(int [] a) { int []b=new int[a.length]; System.arraycopy(a, 0, b, 0, a.length); for(int i=1;i<a.length;i++) { if(b[i]+b[i-1]>b[i]) { b[i]+=b[i-1]; } } int max=0; for(int i=0;i<b.length;i++) { if(max<b[i]) { max=b[i]; } } return max; } public static int getMin(int [] a) { int []b=new int[a.length]; System.arraycopy(a, 0, b, 0, a.length); for(int i=1;i<a.length;i++) { if(b[i]+b[i-1]<b[i]) { b[i]+=b[i-1]; } } int min=0; for(int i=0;i<b.length;i++) { if(min>b[i]) { min=b[i]; } } return min; } public static int getCount(int [] a) { int count=0; for(int i=0;i<a.length;i++) { count+=a[i]; } return count; } }
三、结果截图
四、设计思想以及总结
这道题刚刚看到的时候我的理解就是错误的,我以为需要是连续的整数才算是子数组,原来是只要是连续的加起来大就是子数组,走错了路。之后理解了大佬的方法,但是感觉有些问题,就是他的方法会改变原数组,所以我就新创建了一个数组。之后的问题将数组的首尾连接起来,在蒲同学的点拨之下我明白了。首尾连接起来的数组最大的子数组只有两种情况,就是在中间和前后,只在中间的是第一种情况最好处理。前后的可以吧全部的数加起来然后减去按照第一种类似的方法求出的最小子数组,就是最大的,然后两个比较取最大即可。虽然在课堂上没有把问题处理了,但是课下大佬的倾心相助让我很是感动,问题想不通的时候就需要换个角度思考,往往有新的收获!