力扣——算法入门计划第十二天

简介: 力扣(LeetCode)是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长。 此外,力扣(LeetCode)致力于解决程序员技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化。

 目录

🍕题目70. 爬楼梯

🍔思路

🍟我一开始的想法:

暴力

🍟记忆递推法

🍕题目 198. 打家劫舍

🍔思路

🍟动态规划

🍕题目120. 三角形最小路径和

🍔思路:

🍟代码


🍕题目70. 爬楼梯

70. 爬楼梯

image.png

🍔思路

拿到题目,不慌,先读题:

  1. 一共要爬 n 阶,所以n >= 0;
  2. 一次可以爬 12台阶;
  3. 问爬如果n 阶有多少种走法

比如n = 3 时  一共有三种 : 2+1 1+1+1  1+2  

因为每次只能爬 1级或 2 级,所以 f(x) 只能从 f(x - 1)和 f(x - 2)转移过来,而这里要统计方案总数,我们就需要对这两项的贡献求和。

一般式子         f(n) = f(n-1) + f(n-2) 加上边界 n >= 2

🍟我一开始的想法:

暴力

# 暴力深搜
def climbStairs(self, n: int) -> int:
    if n == 0 or n == 1:
        return 1
    return self.climbStairs(n - 1) + self.climbStairs(n - 2)

image.gif

image.png

好家伙超时了

我们优化一下

🍟记忆递推法

-1 表示没有计算过,最大索引为 n,因此数组大小需要 n + 1

class Solution:
# 记忆化递归,自顶向下
    def climbStairs(self, n: int) -> int:
        def dfs(i: int, memo) -> int:
            if i == 0 or i == 1:
                return 1
            if memo[i] == -1:
                memo[i] = dfs(i - 1, memo) + dfs(i - 2, memo)
            return memo[i]
        # memo: [-1] * (n - 1)
        # -1 表示没有计算过,最大索引为 n,因此数组大小需要 n + 1
        return dfs(n, [-1] * (n + 1))

image.gif

image.png

🍕题目 198. 打家劫舍

image.png

🍔思路

不能拿相邻的房间的钱image.gifimage.png

1)递推公式dp[i]=max(dp[i−2]+nums[i],dp[i−1])

我们再来考虑边界条件

2)边界条件为:

dp[0]=nums[0]
dp[1]=max(nums[0],nums[1])

 
只有一间房屋时候,则偷窃该房屋
只有两间房屋时候,选择其中金额较高的房屋进行偷窃

 

🍟动态规划

class Solution:
    def rob(self, nums: List[int]) -> int:
        if not nums:
            return 0
        size = len(nums)
        if size == 1:
            return nums[0]
        dp = [0] * size
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, size):
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
        return dp[size - 1]

image.gif

image.png

🍕题目120. 三角形最小路径和

image.png

🍔思路:image.gifimage.png

image.gifimage.png 路线的选择,分两种

一种在旁边

if j==0: #最左边的情况
                   triangle[i][j]+=triangle[i-1][j]
elif j==i: #最右边的情况
                   triangle[i][j]+=triangle[i-1][j-1]

一种在中间

triangle[i][j]+=min(triangle[i-1][j-1],triangle[i-1][j])

选上面两个最小的那个

image.gifimage.png

🍟代码

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        if len(triangle)==0: 
            return 0
        #动态规划 dp表示走到当前位置的时候的最小路径
        for i in range(1,len(triangle)):
            for j in range(len(triangle[i])):
                if j==0: #最左边的情况
                    triangle[i][j]+=triangle[i-1][j]
                elif j==i: #最右边的情况
                    triangle[i][j]+=triangle[i-1][j-1]
                else:
                    triangle[i][j]+=min(triangle[i-1][j-1],triangle[i-1][j])
        return min(triangle[-1]) #返回最后一层最小的一个

image.gif

image.png

相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
39 0
|
18天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
27 2
|
2月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
2月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
2月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
2月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
2月前
|
算法
【顺序表】算法题 --- 力扣
【顺序表】算法题 --- 力扣
|
2月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
下一篇
无影云桌面