【LeetCode】力扣刷题之路
题目(20240708~20240712)
746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
– 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
– 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
– 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
– 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
– 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
– 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
– 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。
提示:
- 2 <= cost.length <= 1000
- 0 <= cost[i] <= 999
代码
from typing import List
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
# 动态规划
n = len(cost)
dp = [0] * (n + 1)
dp[0] = cost[0]
dp[1] = cost[1]
for i in range(2, n):
dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]
return min(dp[n - 1], dp[n - 2])
if __name__ == '__main__':
s = Solution()
# 746.使用最小花费爬楼梯 - 示例1
cost = [10, 15, 20]
res = s.minCostClimbingStairs(cost)
print(res) # 输出:15
# 示例2
cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
res = s.minCostClimbingStairs(cost)
print(res) # 输出:6
198.打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。
示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。
提示:
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 400
代码
from typing import List
class Solution:
def rob(self, nums: List[int]) -> int:
# 动态规划
n = len(nums)
if not nums:
return 0
if n == 1:
return nums[0]
dp = [0] * n
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
for i in range(2, n):
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
return dp[-1]
if __name__ == '__main__':
s = Solution()
# 198.打家劫舍 - 示例1
nums = [1, 2, 3, 1]
res = s.rob(nums)
print(res) # 输出:4
# 示例2
nums = [2, 7, 9, 3, 1]
res = s.rob(nums)
print(res) # 输出:12