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

题目描述:

 * 给定一个整数数组 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. 将这代码在力扣上提交也成功通过了。

发布了98 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43732955/article/details/103511151