最大子序和(Java)-面试真题

题目描述

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

样例

输入: [-2,1,-3,4,-1,2,1,-5,4],

输出: 6

解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

算法分析

(动态规划) O(n)

  1. 设 f(i) 表示以第 i 个数字为结尾的最大连续子序列的 和 是多少。

  2. 初始化 f(0)=nums[0]

  3. 转移方程f(i)=max(f(i−1)+nums[i],nums[i])。可以理解为当前有两种决策,一种是将第 i 个数字和前边的数字拼接起来;另一种是第 i 个数字单独作为一个新的子序列的开始。

  4. 最终答案为ans=max(f(k)),0≤k<nans=max(f(k)),0≤k<n。

时间复杂度O(n)

Java代码

/*输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。*/
public class Solution {
    /*f(i)表示从左到右该位置的最大序列和
     * f(0) = nums[0]
     * f(i) = Max【f(i - 1) + nums[i],nums[i]】
     * ans=max(f(k)),0≤k<nans=max(f(k)),0≤k<n。
     * */
    public int maxSubArray(int[] nums) {
        int[] f = new int[nums.length];
        f[0] = nums[0];
        int ans = f[0];
        //为了重复深度遍历,使用动态规划记录该深度的值
        for(int i = 1;i < nums.length;i++)
        {
            f[i] = Math.max(f[i - 1] + nums[i], nums[i]);
            ans = Math.max(ans, f[i]);
        }
        return ans;
    }
}
发布了62 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Yanzudada/article/details/102732633
今日推荐