【L53】动态规划求解最大子序和问题
Question
给定一个整数数组 nums ,
找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
Anwser
当问题可以分解为彼此独立且离散子问题时,可以考虑使用动态规划来解决。
难点在于建模,即设计出动态规划解决方案(找出前后子问题的关系,体现在代码里就是计算公式)。
本题中的关系:
// 暴力求解,时间复杂度是O(N^3)
// func maxSubArray(nums []int) int {
// sum := nums[0]
// for i := 0; i < len(nums); i++ {
// for j := i; j < len(nums); j++ {
// var s int
// for idx := i; idx <= j; idx++ {
// s += nums[idx]
// }
// if s > sum {
// sum = s
// }
// }
// }
// return sum
// } // 暴力求解优化,时间复杂度是O(N^2)
// 事实上,上面的代码有一些重复计算,
// 这是因为相同前缀的区间求和,即后一个区间的和=当前值+前一个区间的和。
// func maxSubArray(nums []int) int {
// sum := nums[0]
// for i := 0; i < len(nums); i++ {
// var s int
// for j := i; j < len(nums); j++ {
// s += nums[j]
// if s > sum {
// sum = s
// }
// }
// }
// return sum
// } // 动态规划,时间复杂度是O(N)
// https://leetcode-cn.com/problems/maximum-subarray/solution/zheng-li-yi-xia-kan-de-dong-de-da-an-by-lizhiqiang/
// func maxSubArray(nums []int) int {
// if 0 == len(nums) {
// return 0
// }
// // 先计算每个子组的最大值
// idx2max := map[int]int{}
// idx2max[0] = nums[0]
// for idx:=1; idx<len(nums); idx++ {
// if idx2max[idx-1] > 0 {
// idx2max[idx] = nums[idx] + idx2max[idx-1]
// } else {
// idx2max[idx] = nums[idx]
// }
// }
// // 找到子组的最大值即全局最大值
// sum := idx2max[0]
// for _, max := range idx2max {
// if max > sum {
// sum = max
// }
// }
// return sum
// } // 动态规划优化,降低空间复杂度
func maxSubArray(nums []int) int {
if 0 == len(nums) {
return 0
}
sum := nums[0] // 记录全局最大值
subMax := nums[0] // 只需要一个int变量保存前面子组合的最大值
for idx := 1; idx < len(nums); idx++ {
if subMax > 0 {
subMax += nums[idx]
} else {
subMax = nums[idx]
}
if subMax > sum {
sum = subMax
}
}
return sum
}
扩展
相关问题
1. 背包问题。
2. 寻找最长公共子串、最长公共子序列。
相似问题
1. 旅行商问题。
2. 集合覆盖问题。
属于NP完全问题,需要使用贪婪算法求取近似解。
【L53】动态规划求解最大子序和问题的更多相关文章
- leetcode-最大子序和(动态规划讲解)
最大子序和(动态规划讲解) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输 ...
- Leetcode题目53.最大子序和(动态规划-简单)
题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连 ...
- Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray)
Leetcode之动态规划(DP)专题-53. 最大子序和(Maximum Subarray) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. ...
- 【每日一题】【暴力、动态规划、动规优化、贪心】2022年1月21日-NC19 连续子数组的最大和/最大子序和
同:最大子序和 https://www.cnblogs.com/liujinhui/p/15574312.html 描述输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组. ...
- Leetcode#53.Maximum Subarray(最大子序和)
题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大. 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] ...
- Leecode刷题之旅-C语言/python-53.最大子序和
/* * @lc app=leetcode.cn id=53 lang=c * * [53] 最大子序和 * * https://leetcode-cn.com/problems/maximum-su ...
- 最大子序和:暴力->递归->动规->线段树
题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode:53. 最大子序和 题解 显而易见的暴力解法 最容易想到的便是暴力穷 ...
- 53. 最大子序和(剑指 Offer 42)
53. 最大子序和(剑指 Offer 42) 知识点:数组:前缀和:哨兵:动态规划:贪心:分治: 题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求 ...
- Leetcode——53.最大子序和
@author: ZZQ @software: PyCharm @file: leetcode53_最大子序和.py @time: 2018/11/26 12:39 要求:给定一个整数数组 nums ...
- 【算法python实现】 -- 最大子序和
原题:https://leetcode-cn.com/problems/maximum-subarray/ 问题描述: 输入:[-2, 1, -3, 4, -1, 2, 1, -5, 4], 输出:6 ...
随机推荐
- 记录一次线上问题排查:JDK序列化问题
场景简要概述 新加了个字段,然后发版,上线就发现了报错 当时这个问题很简单,其实就是用的是 JDK序列化,当时这个类实现了 Serializable接口,但是没显示定义 serialVersionUI ...
- SpringCloud——自定义断言工厂
目录 场景:用户的请求头中需要有指定的用户名和密码才能访问. 断言工厂 参考系统AfterRoutePredicateFactory写法. package com.zjw.factory; impor ...
- CANopen TPDO 配置详解:对象 1800h、1A00h 与实践指南
CANopen TPDO 配置详解:对象 1800h.1A00h 与实践指南 目录 CANopen TPDO 配置详解:对象 1800h.1A00h 与实践指南 目录 引言 TPDO 通讯参数详解 ( ...
- Flex布局-子项
弹性盒子是一种用于 按行 或 按列的一维布局方法. 元素可以膨胀以填充额外的空间, 也可以 收缩 以适应更小的空间. flex 容器项重点 只是用表格进行排版而已, 横向内容无关联哈, 只是简要回忆一 ...
- Excel 数据显示到网页
平时的, 数据分析过程, 会涉及很多表或者, 计算过程嘛, 有的时候, 需要将数据表啥的给同事查看和共享一下, 直接发送, 似乎不够优雅. 直接展示在网页往, 共小伙伴们查看和下载, 不就很香嘛. 其 ...
- No grammar constraints (DTD or XML schema) detected for the document
warning: No grammar constraints (DTD or XML schema) detected for the document 未检测到文档的语法约束(DTD或XML模式) ...
- 「Note」图论方向 - 图论基础
1. 差分约束 1.1. 简介 差分约束算法用于解决如下问题:给出若干形如 \(x_a-x_b\le c\) (均为整数,可以为负数)的不等式,求一组解 \(\{x_i\}\),若不存在解则判断无解. ...
- Client-go的四种客户端的简单使用
Client-go的四种客户端使用 我们知道kubectl是通过命令行交互的方式与Kubernetes API Server进行交互的,Kubernetes还提供了通过编程的方式与Kubernetes ...
- Es简单条件查询
一:先看一下es的语句以及查询结果: 我这边使用的条件是is_device要么是工控要么是资产 二:java代码部分 关于es的操作,java里面不需要添加mapper层,只要在service以及c ...
- 编程记录:TypeScript中never类型的技巧
技巧1 当我们在一个项目中,可能会去改动一个在整个项目中应用很广泛的函数的参数类型,但是可能由于代码量比较庞大,我们不好排查改了之后哪些地方会出现问题,此时我们可以使用never类型来辅助我们的函数, ...