剑指Offer(30):连续子数组的最大和

一、题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)


二、解题思路

1)定义一个值add表示当前add值加上后一个数的和与后一个数自身的最大值,如果两者相加的和大,表示这个连续的子向量较大,反之则表示后一个数自身的值较大不需要连续;
2)定义一个值sum表示add值与之前sum值的最大值,如果add值大,表示该新的连续子向量的和大于原先的子向量和,替换连续子向量,反之则表示原连续子向量和较大。

例如:
数组:{6,-3,-2,7,-15,1,2,2}
add:6
sum:6
数组:{6,-3,-2,7,-15,1,2,2}
add:max(6-3,-3)} 即 3
sum:max(3,6) 即 6
数组:{6,-3,-2,7,-15,1,2,2}
add:max(3-2,-2)} 即 1
sum:max(1,6) 即 6
数组:{6,-3,-2,7,-15,1,2,2}
add:max(1+7,7)} 即 8
sum:max(8,6) 即 8(此处表示6~7的连续子向量的和大于最开始的6)
数组:{6,-3,-2,7,-15,1,2,2}
add:max(8-15,-15)} 即 -7
sum:max(-7,8) 即 8
数组:{6,-3,-2,7,-15,1,2,2}
add:max(-7+1,1)} 即 1(此处表示单独1的子向量大于6~-15的连续子向量和)
sum:max(1,8) 即 8
…遍历完数组时可得到sum为8


三、编程实现

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        int add = array[0];
        int sum = array[0];
        for (int i = 1; i < array.length; i++) {
            add = Math.max(add + array[i], array[i]);
            sum = Math.max(add, sum);
        }
        return sum;
    }
}

猜你喜欢

转载自blog.csdn.net/Fan0628/article/details/88964978
今日推荐