LeetCode 动态规划
动态规划简介
- 动态规划特点:用于求解最优化问题。
- 递推、贪心、搜索、动态规划:
(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