前言
- 组会前一点不慌,反正跑不出好东西,能应付就行,早上直接刷题
70. 爬楼梯 - 力扣(LeetCode)
-
动态规划
-
class Solution:def climbStairs(self, n: int) -> int:dp = [0] * (n+1) # dp[n]表示爬n阶楼梯需要多少格dp[0] = 1 # 0格和1格初始化为1dp[1] = 1 for i in range(2, n+1):dp[i] = dp[i-1] + dp[i-2] # dp[i-1]爬一格 + dp[i-2]爬两格return dp[n]
-
118. 杨辉三角 - 力扣(LeetCode)
- 动态规划
-
class Solution:def generate(self, numRows: int) -> List[List[int]]:res = []for i in range(numRows):res.append([1] * (i + 1)) # 初始化杨辉三角为1for i in range(2, numRows):for j in range(1, i):res[i][j] = res[i-1][j-1] + res[i-1][j] # 等于上面两个元素相加return res
-
198. 打家劫舍 - 力扣(LeetCode)
-
动态规划
-
class Solution:def rob(self, nums: List[int]) -> int:n = len(nums)if n == 1: return nums[0] # 只有一家直接偷dp = [0] * n # dp[n-1]表示到第n家能偷到的最高金额dp[0] = nums[0] # dp[0]第1家直接偷dp[1] = max(nums[0], nums[1]) # dp[1]取最多的一家for i in range(2, n):dp[i] = max(dp[i-2]+nums[i], dp[i-1]) # 前一家/前前家和当前家取最大return dp[n-1]
-
279. 完全平方数 - 力扣(LeetCode)
-
动态规划
-
class Solution:def numSquares(self, n: int) -> int:dp = [float('inf')] * (n + 1) # dp[n]表示和为n的完全平方数的最少数量dp[0] = 0 # 除了dp[0]其他初始化为整数最大方便取minfor i in range(1, n+1):for j in range(1, i+1): # 遍历小于等于i的完全平方数j*jif j * j > i: break # 保证j*j<=idp[i] = min(dp[i], dp[i - j * j] + 1) # 更新最小数return dp[n]
-
-
数学:四平方和定理
-
class Solution:def numSquares(self, n: int) -> int:# 判断是否为完全平方数def is_square(num):sqrt_num = int(math.sqrt(num))return sqrt_num * sqrt_num == num# 根据四平方和定理判断最少需要几个完全平方数的和(上界就是四个)# 如果 n = 4^k * (8 * m + 7),可表示为四个平方数和while n % 4 == 0:n //= 4if n % 8 == 7:return 4# 如果本身是平方数,则为一个平方数if is_square(n):return 1# 遍历(1,√n),判断n是否为a^2 + b^2,两个平方数for i in range(1, int(math.sqrt(n)) + 1):if is_square(n - i*i):return 2# 其他情况就是三个平方数return 3
-
322. 零钱兑换 - 力扣(LeetCode)
-
动态规划
-
class Solution:def coinChange(self, coins: List[int], amount: int) -> int:dp = [float('inf')] * (amount + 1) # dp[n]表示凑成n最少硬币数dp[0] = 0 # dp[0]初始化为0for i in range(1, amount + 1): for j in range(len(coins)):if i >= coins[j]: # 如果有可用硬币dp[i] = min(dp[i], dp[i - coins[j]] + 1) # 更新最小值为:用掉该硬币的最少硬币数 + 1if dp[amount] != float('inf'): return dp[amount] # 如果更新过,返回结果else: return -1 # 如果没更新过,说明没有可用硬币,返回-1
-
后言
- 干饭去咯!下午组会挺住压力!!!!