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

简介: 力扣(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月前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
2月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
2月前
|
存储 算法 编译器
算法入门:剑指offer改编题目:查找总价格为目标值的两个商品
给定递增数组和目标值target,找出两数之和等于target的两个数字。利用双指针法,left从头、right从尾向中间逼近,根据和与target的大小关系调整指针,时间复杂度O(n),空间复杂度O(1)。找不到时返回{-1,-1}。
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
5月前
|
机器学习/深度学习 数据采集 算法
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
129 0
|
8月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
413 10
|
9月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
703 2
|
12月前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
304 4
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
181 2