动态规划、贪心

https://leetcode.com/problems/climbing-stairs/description/

https://leetcode.com/problems/triangle/description/

https://leetcode.com/problems/maximum-product-subarray/description/

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/#/description

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/

https://leetcode.com/problems/longest-increasing-subsequence

https://leetcode.com/problems/coin-change/

https://leetcode.com/problems/edit-distance/

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/description/

https://leetcode.com/problems/lemonade-change/description/

https://leetcode.com/problems/assign-cookies/description/

https://leetcode.com/problems/walking-robot-simulation/description/

70.爬楼梯

链接

class Solution:
    def climbStairs(self, n: int) -> int:
        # 1 <= n <= 45
        # 状态定义,数组长度+1,兼容n=1的情况
        dp = [0] * (n + 1)
        dp[0] = dp[1] = 1
        # 从2开始(因为要-2)到数组结束
        for i in range(2, n + 1):
            # 状态转移方程
            dp[i] = dp[i - 1] + dp[i - 2]
        return dp[n]

优化空间复杂度

class Solution:
    def climbStairs(self, n: int) -> int:
        f1 = f2 = 1
        for i in range(2, n + 1):
            # f = f1 + f2
            # f1 = f2
            # f2 = f
            f1, f2 = f2, f1 + f2
        return f2

120.三角形最小路径和

链接

from typing import List

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        # 自底向上递推,dp[i,j]=dp[i,j]+min(dp[i+1,j],dp[i+1,j+1])
        # 状态压缩,dp数组只要一维就可以了
        # 初始化dp为triangle[-1]
        dp = triangle[-1]
        for i in range(len(triangle) - 2, -1, -1):
            for j in range(len(triangle[i])):
                dp[j] = triangle[i][j] + min(dp[j], dp[j + 1])
        return dp[0]

152.乘积最大子数组

链接

from typing import List

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        n = len(nums)
        dp = [[0] * 2 for _ in range(n)]
        res = dp[0][0] = dp[0][1] = nums[0]

        for i in range(1, n):
            if nums[i] >= 0:
                dp[i][1] = max(dp[i - 1][1] * nums[i], nums[i])
                dp[i][0] = min(dp[i - 1][0] * nums[i], nums[i])
            else:
                dp[i][1] = max(dp[i - 1][0] * nums[i], nums[i])
                dp[i][0] = min(dp[i - 1][1] * nums[i], nums[i])
            res = max(dp[i][1], res)
        return res

状态压缩

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        n = len(nums)
        res = curMax = curMin = nums[0]

        for i in range(1, n):
            curMax, curMin = curMax * nums[i], curMin * nums[i]
            curMax, curMin = max(curMax, curMin, nums[i]), min(curMax, curMin, nums[i])
            res = max(res, curMax)
        return res

300.最长递增子序列

链接

方式一(DP):

from typing import List

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        n = len(nums)
        dp = [1 for _ in range(n)]
        res = 1
        for i in range(1, n):
            for j in range(0, i):
                if nums[j] < nums[i]:
                    dp[i] = max(dp[i], dp[j] + 1)
                    res = max(res, dp[i])
        return res

方式二(二分):

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        res = [nums[0]]
        for i in range(1, len(nums)):
            # 大于最大的,就追加
            if nums[i] > res[-1]:
                res.append(nums[i])
            else:   # 否则替换大于等于nums[i]的最小的那个
                index = bisect_left(res, nums[i])
                res[index] = nums[i]
        return len(res)

322.零钱兑换

链接

```

### 72.编辑距离

[链接](https://leetcode.cn/problems/edit-distance/)

```python

results matching ""

    No results matching ""