力扣(53)--------最大子序和

本文深入探讨了解决最大子数组和问题的两种方法:暴力循环与动态规划。通过实例[-2,1,-3,4,-1,2,1,-5,4],详细解析了动态规划方法的实现过程,展示了如何高效地找出具有最大和的连续子数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
 * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
 * 示例:输入: [-2,1,-3,4,-1,2,1,-5,4],
 * 输出: 6
 * 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6
解法一:

直接用暴力循环的方式,求出所有序列的和 然后取出最大值。这里就记录相关代码了。

解法二:

使用动态规划的方法,定义DP(i):以i节点为结束节点的最大值。动态转移方程:DP[i] = max(arr[i],DP[i-1]+arr[i])。当得到动态转移方程后,因为DP(0) =本身。然后可以推导出 DP(1)…DP(2)…DP(3)…DP(n) 。而我们想要的结果就是max(DP(1)…DP(2)…DP(3)…DP(n)) .代码如下:
因为我们只要每次比较相邻的DP(i)、DP(i-1)然后取出较大值 然后用较大者与 max相比较即可。可以省去 存储所有DP(i)的空间。

package leetcode;

import org.junit.Test;

/**
 * @author liuzihao
 * @create 2019/12/12-15:44
 * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
 * 示例:输入: [-2,1,-3,4,-1,2,1,-5,4],
 * 输出: 6
 * 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6
 */
public class Demo53 {
    // 定义DP[i]以 i节点为序列的最大值
    //DP[i] = max(arr[i],DP[i-1]+arr[i])
    //结果为 MAX(DP(i),DP(i-1),DP(i-2),DP(i-3)......DP(0))
    @Test
    public void test01(){
        int [] arr = {-2,1,-3,4,-1,2,1,-5,4};
        int max = Integer.MIN_VALUE;
        int cur_max = 0;
        for (int i = 0; i < arr.length; i++) {
            cur_max = Math.max(cur_max+arr[i],arr[i]);
            max = Math.max(cur_max,max);
        }

        System.out.println(max);
    }
}

输出结果为6. 将这代码在力扣上提交也成功通过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值