leetcode第53题、152题动态规划思路

leetcode第53题、152题动态规划思路

53:和最大子序列

对于和最大子序列,暴力枚举的方法思路简单但是复杂度太高(O(n^3))。
对于数组A[],记以A[i]为结尾的所有子数组的和的局部最大值为local_max,当前所有子数组的全局最大值为global_max,则有
local_max = max(local_max + A[i], A[i])
global_max = max(local_max, global_max)
以C++代码为例,

在这里插入代码片
int local = nums[0];
        int global = nums[0];
        for (auto i = 1; i < nums.size(); ++i){
            local = (local + nums[i] > nums[i]) ? local + nums[i] : nums[i];
            global = (local > global) ? local : global;
        }
        return global;

152:乘积最大子序列

与求和最大子序列类似,也采用动态规划的方法,但考虑到正负的问题,要同时维护两个局部值,分别是局部最大local_max和局部最小local_min,则有
local_max_copy = local_max //保存当前局部最大
local_max = max(local_maxA[i], local_minA[i], A[i])
local_min = min(local_max_copyA[i], local_minA[i], A[i])
global = max(local_max,global)
以C++代码为例,

int local_max = nums[0];
        int local_min = nums[0];
        int global = nums[0];
        for (auto i = 1; i < nums.size(); ++i){
            int local_max_copy = local_max;
            local_max = (local_max * nums[i] > local_min * nums[i]) ? local_max * nums[i] : local_min * nums[i];
            local_max = local_max > nums[i] ? local_max : nums[i];
            local_min = local_max_copy * nums[i] < local_min * nums[i] ? local_max_copy * nums[i] : local_min * nums[i];
            local_min = local_min < nums[i] ? local_min : nums[i];
            global = global > local_max ? global : local_max;
        }
        return global;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值