跟着leedcode刷算法 -- 动态规划3

117 阅读2分钟

这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

image.png

题5

完全平方数

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

 

示例 1:

  • 输入:n = 12

  • 输出:3

  • 解释:12 = 4 + 4 + 4 示例 2:

  • 输入:n = 13

  • 输出:2

  • 解释:13 = 4 + 9   提示:

1 <= n <= 104 相关标签

  • 广度优先搜索
  • 数学
  • 动态规划

思路: 多次遍历取最小值

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [row for row in range(n+1)]
        for row in range(1,n+1):
            j = 1
            while row - j*j >= 0:
                dp[row] = min(dp[row],dp[row-j*j]+1)
                j += 1
        return dp[-1]

执行结果:

image.png

题6

最长上升子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

  示例 1:

  • 输入:nums = [10,9,2,5,3,7,101,18]

  • 输出:4

  • 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 示例 2:

  • 输入:nums = [0,1,0,3,2,3]

  • 输出:4 示例 3:

  • 输入:nums = [7,7,7,7,7,7,7]

  • 输出:1 

提示:

  • 1 <= nums.length <= 2500

  • -104 <= nums[i] <= 104   进阶:

  • 你可以设计时间复杂度为 O(n2) 的解决方案吗?

  • 你能将算法的时间复杂度降低到 O(n log(n)) 吗? 相关标签

  • 数组

  • 二分查找

  • 动态规划

思路: 本题思路和上一题比较像,上一题求最少的值,本题要取最大的值,同样的做法,进行两次遍历,然后对dp进行操作,最后取最大的值就是所求的值了

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

执行结果:

image.png