求整数数组中最大子数组之和解法思路


题目要求的就是找到最大的相对高度,就是落差,而且有正负之分,

用一个比较好理解的算法,

 在最初的点画一个水平线,作为海拔高度为零的水平线,然后这个随着这个心电图往后移,每一个点与原点的相对高度会被记录比较,我们只需要记住他最巅峰的时候;

假如相对高度为负,那就我们就可以把所谓的原点抛弃了,既然留着它并不再会给我们带来收益,而只有亏损的话,那为什么还留着呢,我们就不需要它了

这个时候把由正转为负的点作为原点,

落差是一直在变的,他是一个参考值,落差的最大值会被记录下来,就是巅峰值,就是我们要求的最大子数组之和

 如图,当沿着线走到点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 }

 也许用这个图视觉效果更好一点,不过也不想改了

相关