算法---求连续子系列最大值问题

假设给定一段没有任何限制的整数数列,求该数列中子序列和的的最大值.

   解决该问题的方法有最直接的o(n^3)级求出所有子序列,逐个找出最大值的这种方法我们不在介绍,我们直接介绍时间复杂度为o(n)级的算法.

该问题的关键思路就是我们要抓住"任意一个负数开头的子序列不可能是最大和子序列" ,理解了这句后,接下来的问题简单许多,假如我们用该思想来处理上述样例:   int []arr=''-2,11,-4,13,-5,-2".

首先我们设一个thisSum变量和maxSum变量,我们先让thisSum += arr[i]; ,然后再判断thisSum是否大于maxSum,如果大于就让maxSum = thisSum;.然后我们再就行判断是否thisSum<0了,如果小于0了,我们就给他赋0,让他舍弃之前保存到的子序列和.

我们给出代码:

			public static void main(String[] args) {
				   
					          int maxSum = Integer.MIN_VALUE;
					          int []arr= {-1,-4,-7,-8};
					                   int thisSum = 0;
					                  for (int i = 0; i < arr.length; i++) {
					                      thisSum += arr[i];
					                      if (thisSum > maxSum)// thisSum在[0,maxSum]之间时不需要任何处理
					                          maxSum = thisSum;
					                     else if (thisSum < 0)// 说明加上当前元素使得子序列为负数了,那么抛弃这段子序列(相当于thisSum赋值为0),从下一轮for开始
					                          thisSum = 0;
					    
					     }
					                  System.out.println(maxSum);
			}

猜你喜欢

转载自blog.csdn.net/weixin_42504145/article/details/82904170