当前位置:网站首页>剑指 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;
}
边栏推荐
- Conversation technology [dark horse introduction series]
- 会话技术【黑马入门系列】
- Kingbasees can realize any of MySQL by constructing an aggregate function_ Value function.
- standard-version(发版与 Changelog 自动化)
- LeetCode 每日一题 2021/7/11-2021/7/17
- [JVM] heap memory, escape analysis, on stack allocation, synchronous omission, scalar replacement details
- Will it be a little late to realize your "wonderful" 360?
- C语言一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
- [C# 类和对象]-C# 中的方法以及类和对象编程
- WPF 三维应用搭建(基础)
猜你喜欢

Jira --- workflow call external api

Wechat oauth2.0 login process and security analysis

【JVM】之虚拟机栈

By voting for the destruction of STI by Dao, seektiger is truly community driven

FMC sub card: 4-way sfp+ 10 Gigabit optical fiber network FMC sub card

【flask入门系列】异常处理

Redis transaction

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

Object detection and bounding box
![Paddleserving服务化部署 tensorrt报错, shape of trt subgraph is [-1,-1,768],](/img/15/5dde91261a44fcfeda4d8436bb8559.png)
Paddleserving服务化部署 tensorrt报错, shape of trt subgraph is [-1,-1,768],
随机推荐
Visit Beijing Zoo in dog days
DP动态规划企业级模板分析(数字三角,上升序列,背包,状态机,压缩DP)
【MySQL】 MVCC:正确理解MVCC及其实现原理
Pytoch notes (2)
4-channel FMC interface baseband signal processing board (2 FMC interfaces, 2 fmc+ interfaces)
redis分布式锁
深圳保诚笔试记录
串口通讯到底有没有累积误差及对时钟精度的要求
牛客题目——打家劫舍一、打家劫舍二
First experience of openvino machine learning
How to use curl in Jenkins pipeline and process response results
Xilinx ultrascale+ MPSoC (zu9eg/zu15eg) high performance PCIe data preprocessing board
LeetCode 每日一题 2021/7/11-2021/7/17
Junit5
[MySQL] transaction: basic knowledge of transaction, implementation principle of MySQL transaction, detailed explanation of transaction log redolog & undo
神经网络和自动控制的联系
会话技术【黑马入门系列】
Paddleserving服务化部署 tensorrt报错, shape of trt subgraph is [-1,-1,768],
Jd.com's purchase intention forecast (IV)
半导体材料技术