最大子数组和——贪心和动态规划


问题

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。


一、解决思路

这道题有两种解法:贪心 or 动态规划
(1)贪心
贪心要明白贪的是什么,对于这道题而言,假若连续和是一个负数,那么加上下一个数时,要么就是变大了,要么就是变小了,假若是变大了,那么加上这个数一定是一个正数,不如直接令这个数为当前最大和来得大,这就是要贪的地方,对于代码的实现就是,出现负数时,令这个负数等于0,因为负数只会降低和的大小,因此贪的是遇到负数和及舍弃。
(2)动态规划
动态规划解法需要理解状态转移方程:
当前状态和取决于上一状态,和当前的值,那么只需要取(上一状态+当前值)和(当前值)的较大值作为当前状态值即可,如果当前值大于上一状态+当前值的话,意味着上一状态的值可以被舍弃,因为它是负数。不难写出状态转移方程
df[i] = max(df[i-1]+nums[i], nums[i])
然后遍历时取最大即可。

二、使用步骤

1.贪心

代码如下(示例):

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int count = 0;
        int result = INT_MIN;
        for (int i=0; i<nums.size(); i++){
            count += nums[i];
            if (count>result){
                result = count;
            }
            if (count<0){
                count = 0;
            }
        }
        return result;
    }
};

2.动态规划

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

总结

对于贪心问题需要认清贪的是什么,对于动态规划,需要写出状态的转移方程,理解状态之间的关系就不难写出转态转移方程,那什么时候用动态规划呢?一般就是需要遍历数组或者其它类似数组的数据类型的所有状态时,然后状态之间的转换存在关系时,就可以考虑动态规划了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值