当前位置:网站首页>剑指 Offer 42. 连续子数组的最大和-动态规划法
剑指 Offer 42. 连续子数组的最大和-动态规划法
2022-07-17 06:46:00 【Mr Gao】
剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
假设 nums\textit{nums}nums 数组的长度是 nnn,下标从 000 到 n−1n-1n−1。
我们用 f(i)f(i)f(i) 代表以第 iii 个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:
max0≤i≤n−1{f(i)}\max_{0 \leq i \leq n-1} { f(i) } 0≤i≤n−1max{f(i)}
因此我们只需要求出每个位置的 f(i)f(i)f(i),然后返回 fff 数组中的最大值即可。那么我们如何求 f(i)f(i)f(i) 呢?我们可以考虑 nums[i]\textit{nums}[i]nums[i] 单独成为一段还是加入 f(i−1)f(i-1)f(i−1) 对应的那一段,这取决于 nums[i]\textit{nums}[i]nums[i] 和 f(i−1)+nums[i]f(i-1) + \textit{nums}[i]f(i−1)+nums[i] 的大小,我们希望获得一个比较大的,于是可以写出这样的动态规划转移方程:
f(i)=max{f(i−1)+nums[i],nums[i]}f(i) = \max { f(i-1) + \textit{nums}[i], \textit{nums}[i] } f(i)=max{f(i−1)+nums[i],nums[i]}
不难给出一个时间复杂度 O(n)O(n)O(n)、空间复杂度 O(n)O(n)O(n) 的实现,即用一个 fff 数组来保存 f(i)f(i)f(i) 的值,用一个循环求出所有 f(i)f(i)f(i)。考虑到 f(i)f(i)f(i) 只和 f(i−1)f(i-1)f(i−1) 相关,于是我们可以只用一个变量 pre\textit{pre}pre 来维护对于当前 f(i)f(i)f(i) 的 f(i−1)f(i-1)f(i−1) 的值是多少,从而让空间复杂度降低到 O(1)O(1)O(1),这有点类似「滚动数组」的思想。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
int maxSubArray(int* nums, int numsSize){
int dp[numsSize+1];
dp[0]=0;
int i;
int max=-99;
for(i=1;i<=numsSize;i++){
dp[i]=fmax(dp[i-1]+nums[i-1],nums[i-1]);
if(dp[i]>max){
max=dp[i];
}
// printf("%d ",dp[i]);
}
return max;
}
边栏推荐
- redis集群
- Export file or download file
- Xilinx ultrascale+ MPSoC (zu9eg/zu15eg) high performance PCIe data preprocessing board
- 半导体材料技术
- 【flask入门系列】异常处理
- 【MySQL】 锁机制:InnoDB引擎中锁分类以及表锁、行锁、页锁详解
- 1669. Merge two linked lists (merge of two linked lists)
- CAD fill to polyline script
- 代码学习(DeamNet)CVPR | Adaptive Consistency Prior based Deep Network for Image Denoising
- Wechat oauth2.0 login process and security analysis
猜你喜欢

【flask入门系列】请求钩子与上下文

1669. Merge two linked lists (merge of two linked lists)

分叉币的发展史及价值|ETH、BCH、BSV 2020-03-08

Understand LSTM and Gru

redis消息订阅

Discussion on risc-v Technology

“韭菜”是怎么把钱送给“镰刀”的? 2020-03-07

Ruffian Heng embedded bimonthly issue 58

DP动态规划企业级模板分析(数字三角,上升序列,背包,状态机,压缩DP)

【MySQL】 事务:事务基础知识、MySQL事务实现原理、事务日志 redolog & undolog 详解
随机推荐
Pytorch notes (5)
Junit5
半导体材料技术
类型详解·自定义类型·结构体初识
Xinlinx zynq7010 domestic replacement fmql10s400 national production arm core board + expansion board
在线问题反馈模块实战(五):实现对通用字段内容自动填充功能
Export file or download file
standard-version(发版与 Changelog 自动化)
[MySQL] lock mechanism: detailed explanation of lock classification, table lock, row lock and page lock in InnoDB engine
Download, installation and use of mongodb
the max_ iter was reached which means the coef_ did not converge “the coef_ did not converge“
Yolov5 label and establish your own data set
KingbaseES 中可以通过构造一个聚集函数来实现mysql的any_value功能。
RISC-V技术杂谈
redis主从复制
Flutter3.0 (framework) - UI rendering
Go语言圣经
《牛客刷题》sql错题集
V8 引擎如何进行垃圾内存的回收?
Facial key point detection CNN