图解算法——最大子序和

1、题目描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

题目来源:
https://leetcode-cn.com/problems/maximum-subarray/

2、示例

示例1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例2:

输入:nums = [1]
输出:1

提示:

  • 1 <= nums.length <= 3 * 104
  • -105 <= nums[i] <= 105

3、解题思路

以  [-2,1,-3,4,-1,2,1,-5,4]  为例:

当我们以下标为 i 时,如果我们定义包含下标 i 处的节点 arr[i] 的最大连续子数组和为 f(i) , 那么,包含下一位 i+1 处的节点 arr[i+1] 的最大连续子数组和为 f(i+1) = max( f(i) + arr[i+1], arr[i+1] );

代码如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0];
        int pre = 0;
        for(int i = 0; i<nums.length; i++){
            pre = Math.max(pre+nums[i], nums[i]);
            max = Math.max(max, pre);
        }
        return max;
    }
}

复杂度分析:

  • 时间复杂度:O(n),其中 n 为 nums 数组的长度。我们只需要遍历一遍数组即可求得答案。
  • 空间复杂度:O(1),我们只需要常数空间存放若干变量。

提交记录:

4、进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

下篇再续...

Over...........

原文地址:https://www.cnblogs.com/gjmhome/p/15110730.html