LeetCode 动态规划

LeetCode 动态规划

动态规划简介

  1. 动态规划特点:用于求解最优化问题。
  2. 递推、贪心、搜索、动态规划:
    (1) 每个阶段只有一个状态->递推;
    (2) 每个阶段的最优状态都是由上一个阶段的最优状态得到的->贪心;
    (3) 每个阶段的最优状态是由之前所有阶段的状态的组合得到的->搜索;
    (4) 每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的->动态规划。

53. 最大子序和

题目描述:

思路1: 动态规划。至于怎么想到要用动态规划的,还不晓得(⊙_⊙)。具体思路为,在遍历数组时,求解到当前位置的子数组的最大子序和。当前位置的子数组的最大子序和(设为max),只与两个数相关:一个是到前一个位置的子数组的最大子序和(设为pre_max);另一个是当前数(设为num),则max为pre_max+num与num中的较大那个值(不用管pre_max是怎么得到的,其实也是同样方式得到的)。

Python代码:

class Solution:
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(1, len(nums)):
            nums[i] = max(nums[i], nums[i]+nums[i-1])
        
        return max(nums)

152. 乘积最大子数组

题目描述: 从一个整数数组 nums中找出乘积最大的连续子数组(该子数组中至少包含一个数字),返回其最大积。

思路1: 刚开始没想到用动态规划,写的方法超出时间限制。别人的代码看起来简单,也理解了很久。主要就是用一个变量max记录最大值,一个变量记录最小值。当前数为正数时,与最大值的乘积可能变为新的最大值,与最小值的乘积可能变成新的最小值;当前数为复数时,与最大值的乘积可能变成新的最小值,与最小值的乘积可能变成新的最大值。总之,画草稿或者调试代码帮助理解。

Python代码:

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        curr_max, curr_min, res_max = nums[0], nums[0], nums[0]
        
        for i in range(1, len(nums)):
            tepm1 = curr_max * nums[i]
            temp2 = curr_min * nums[i]

            if nums[i] >= 0:
                curr_max = max(tepm1, nums[i])
                curr_min = min(temp2, nums[i])
            else:
                curr_max = max(temp2, nums[i])
                curr_min = min(tepm1, nums[i])

            res_max = max(curr_max, res_max)

        return res_max
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值