求整数数组中最大子数组之和解法思路
题目要求的就是找到最大的相对高度,就是落差,而且有正负之分,
用一个比较好理解的算法,
在最初的点画一个水平线,作为海拔高度为零的水平线,然后这个随着这个心电图往后移,每一个点与原点的相对高度会被记录比较,我们只需要记住他最巅峰的时候;
假如相对高度为负,那就我们就可以把所谓的原点抛弃了,既然留着它并不再会给我们带来收益,而只有亏损的话,那为什么还留着呢,我们就不需要它了
这个时候把由正转为负的点作为原点,
落差是一直在变的,他是一个参考值,落差的最大值会被记录下来,就是巅峰值,就是我们要求的最大子数组之和
如图,当沿着线走到点1的时候,海拔会为负,点1 会作为新的海拔为0的原点,然后走到点2 的时候,落差会达到最大,从图上看,这个落差值也会成为后来的巅峰值,
然后继续,当点走到点3的时候,落差再次变为0,点3成为新的海拔为0的原点;
大概就是这个思路了,
下面这个是代码
运行结果
1 import java.util.Scanner; 2 3 public class t1 { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int meter,peak=0,drop=0; 7 System.out.println("请输入需要输入的整数个数:"); 8 meter = sc.nextInt(); 9 int point[] = new int[meter]; 10 System.out.println("请依次输入每一个整数..."); 11 for(int z=0;z< meter;z++){ 12 point[z] = sc.nextInt(); 13 } 14 for(int z=0;z){ 15 if(z==0){ 16 peak = point[z]; 17 drop = point[z]; 18 }else{ 19 if (drop<0){ 20 drop = point[z]; 21 }else{ 22 drop+=point[z]; 23 } 24 } 25 peak = (peak>drop)?peak:drop; 26 } 27 System.out.println("最大子数组之和为"+peak); 28 } 29 }
也许用这个图视觉效果更好一点,不过也不想改了