【题解报告1】最大子数组和

一、题目链接

53. 最大子数组和

二、题目介绍

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23

三、涉及知识点

数组;递推;动态规则

四、算法分析

动态规划题大致流程
1.设计状态
2.写出状态转移方程
3.设定初始状态
4.执行状态转移
5.返回最终的解

定义一个状态数组dp[i],dp[i]表示以第i个整数结尾的子数组中的最大值。
(第i个整数对应的是数组下标,从0开始)
以第i个整数结尾的子数组中的最大值分为两种情况:
1.第i个整数和dp[i-1]相加
2.就单独只是第i个整数作为子数组

所以我们只需要通过max()函数找出1和2两种情况中的最大值即可。

所以我们只要初始化dp[0]=nums[0] (因为第0个整数前面已经没有任何元素了,所以以第0个整数结尾的子数组中的最大值就是上面的第2点的情况),然后就得出了状态转移方程dp[i]=max(dp[i-1]+nums[i],nums[i])(i!=0时),然后在找出dp[i]中的最大值即可。

五、源码讲解


int max(int a,int b){(8)
    return a>b?a:b;
}
int maxSubArray(int* nums, int numsSize) {
    int dp[100000];(1)
    dp[0] = nums[0]; (2)
    int maxValue = nums[0];(3)
    for(int i=1;i<numsSize;i++){(4)
        dp[i] = max(dp[i-1]+nums[i],nums[i]);(5)
        maxValue = max(dp[i],maxValue);(6)
    }
    return maxValue;(7)
}

编码的话就比较简单了,只要能理解上面的算法分析挺容易实现的
(1)因为numsSize最大为100000,所以状态数组dp[100000]就行
(2)初始化dp[0]=nums[0]
(3)定义一个变量maxValue用来寻找出dp[]数组中的最大值,初始化等于dp[0]
(4)从下标为1的数字开始遍历整个nums数组
(5)利用上述的状态转移方程执行状态转移
(6)同时不断迭代maxValue,找出dp[]中的最大值
(7)返回maxValue
(8)max()函数的实现

六、FAQ

有什么问题欢迎指出!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值