【力扣hot100】刷题笔记Day24

前言

  • 组会前一点不慌,反正跑不出好东西,能应付就行,早上直接刷题

70. 爬楼梯 - 力扣(LeetCode)

  • 动态规划

    • class Solution:
          def climbStairs(self, n: int) -> int:
              dp = [0] * (n+1)   # dp[n]表示爬n阶楼梯需要多少格
              dp[0] = 1          # 0格和1格初始化为1
              dp[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))  # 初始化杨辉三角为1
              for 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]其他初始化为整数最大方便取min
              for i in range(1, n+1):
                  for j in range(1, i+1):  # 遍历小于等于i的完全平方数j*j
                      if j * j > i: break  # 保证j*j<=i
                      dp[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 //= 4
              if 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]初始化为0
              for 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)  # 更新最小值为:用掉该硬币的最少硬币数 + 1
              if dp[amount] != float('inf'): return dp[amount]  # 如果更新过,返回结果
              else: return -1   # 如果没更新过,说明没有可用硬币,返回-1

 后言

  • 干饭去咯!下午组会挺住压力!!!!

你可能感兴趣的:(力扣hot100刷题笔记,leetcode,笔记,算法,职场和发展,数据结构)