• 连续子数组的最大和
    • 题目
    • 解题思路

    连续子数组的最大和

    题目

    牛客网

    例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

    解题思路

    通过动态规划计算最大和,f(i) 定义为以第 i 个数字结尾的子数组的最大和,那么 max(f(i)) 就有以下公式:

    $$
    max(f(i))=\begin{cases}
    num[i] & i=0 or f(i)<0\\ num[i]+f(i) & i\ne0 and f(i)>0
    \end{cases}
    $$

    1. public int FindGreatestSumOfSubArray(int[] array) {
    2. if (array == null || array.length == 0) {
    3. return 0;
    4. }
    5. int max = array[0];
    6. int sum = 0;
    7. for (int a : array) {
    8. if (sum + a > a) {
    9. sum += a;
    10. } else {
    11. sum = a;
    12. }
    13. if (sum > max) {
    14. max = sum;
    15. }
    16. }
    17. return max;
    18. }