这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战
题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]
执行结果:
题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)
执行结果: