【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 ...
随机推荐
- ESP32教程:通过WIFI控制LED灯的开关
LED闪烁 在通过WIFI控制LED灯的开关之前,我们先实现一下LED闪烁. 接线图: 来源:https://esp32io.com/tutorials/esp32-led-blink 我的接线图: ...
- 【记录】PR|一些使用技巧记录
文章目录 [PR最重要的两个操作] 一.关键帧 1. 如何设置关键帧? 2. 应用实例 1)1s内视频从明变暗 2)1s内视频画面由大到小 二.入点.出点 [其他] PR批量调整视频效果 PR剪视频片 ...
- 信息资源管理文字题之“CIO基础职能”
一.案例:某公司招聘CIO的岗位职责包括如下内容: (1)按照公司发展战略,负责组织制定公司信息化中长期发展规划和年度工作计划,并组织实施: (2)负责组织制定完善公司有关规章制度,并贯彻执行 (3) ...
- HarmonyOS Next开发教程之地图定位
今天分享一下在鸿蒙开发中的地图定位问题,也就是在地图中如何定位自己所在的位置. 关于如何加载显示地图在之前的文章已经详细介绍过,有问题的友友可以点击查看: HarmonyOS NEXT实战教程-实现K ...
- CLion打开VS创建的GBK编码格式的项目中文乱码问题的解决方法
在 CLion 中设置 GBK 编码用于编译代码时,如果输出的 message 乱码,通常是由于控制台编码与代码文件的编码不匹配导致的.以下是解决问题的步骤: 1. 设置文件编码为 GBK 确保你的源 ...
- vue3 基础-具名插槽 & 作用域插槽
上篇对 slot 的基本概念和使用有一个初步的认识, 即通过 slot 的这种设计, 父组件可以在调用子组件的时候, 给组件之间传递一波 dom, 子组件通过 slot 标签来进行接收. slot 默 ...
- 秒杀/高并发解决方案+落地实现 (技术栈: SpringBoot+Mysql + Redis +RabbitMQ +MyBatis-Plus +Maven + Linux + Jmeter )-01
秒杀/高并发方案-介绍 @ 目录 秒杀/高并发方案-介绍 秒杀/高并发解决方案+落地实现 (技术栈: SpringBoot+Mysql + Redis +RabbitMQ +MyBatis-Plus ...
- 插件分享 | 善用 VSCode 内置的效率神器 Emmet 插件提升前端开发效率
在 VSCode 出现之前,Emmet 插件就在前端领域玩得风生水起,当时的 Sublime Text 装上此插件,前端的编码效率那感觉就如同 2G 网络到 5G 网络的差别一般. 后来 VSCode ...
- 在MySQL中悲观锁及乐观锁的应用
本文由 ChatMoney团队出品 在数据库管理系统中,锁机制是保证数据一致性和并发控制的重要手段.MySQL,作为广泛使用的数据库系统之一,提供了多种锁策略来处理并发访问时可能引发的数据不一致性问题 ...
- HTTP1和HTTP2的区别
HTTP1和HTTP2的区别 一.Http1 Http1.x 缺点: 线程阻塞,在同一时间,同一域名的请求有一定数量限制,超过限制的书目录的请求会被阻塞 短连接:浏览器和服务器他只保持短暂的连接,浏览 ...