力扣热题100_动态规划_70_爬楼梯


题目链接

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

解题思路

    # 思路:动态规划
    # 1. 划分阶段
        # 按照台阶的层数进行划分为 0 ~ n。

    # 2. 定义状态
        # 定义状态 dp[i] 为:爬到第 i 阶阶台阶的方案数。

    # 3. 状态转移方程
        # 根据题目大意,每次只能爬 1 或 2 个台阶。
        # 则第 i 阶楼梯只能从第 i-1 阶向上爬 1 阶上来,或者从第 i-2 阶向上爬 2 阶上来。
        # 所以可以推出状态转移方程为 dp[i - 1] + dp[i - 2] 。

    # 4.初始条件
        # 第 0 层台阶数:可以看做 1 种方法(从 0 阶向上 0 阶),即 dp[0] = 1。
        # 第 1 层台阶方案数:1种方法(从 0 阶向上 1 阶),即dp[1] = 1。
        # 第 2 层台阶方案数:2种方法(从 0 阶向上 2 阶,或者从 1 阶向上 1 阶)。
    # 5. 最终结果
        # 根据状态定义,最终结果为 dp[n] ,即爬到第 n 阶台阶(即楼顶)的方案为 dp[n]。

解题代码

class Solution:
    def climbStairs(self, n: int) -> int:
        dp = [0 for _ in range(n + 1)]
        dp[0] = 1
        dp[1] = 1

        for i in range(2, n + 1):
            dp[i] = dp[i - 2] + dp[i - 1]
        return dp[n]

参考资料:datawhalechina

### 力扣 HOT 100 中与 Python 相关的目及解决方案 力扣LeetCode)上的目列表——HOT 100 是许多开发者练习算法和数据结构的重要资源。以下是几个典型的 HOT 100 目及其对应的 Python 解决方案概述。 #### 两数之和 (Two Sum) 这是一个经典的入门级问,目标是从给定数组中找到两个数,使它们相加等于指定的目标值。可以通过哈希表来优化查找过程[^2]。 ```python def twoSum(nums, target): hashmap = {} for i, num in enumerate(nums): complement = target - num if complement in hashmap: return [hashmap[complement], i] hashmap[num] = i ``` #### 最长连续序列 (Longest Consecutive Sequence) 此问是关于如何高效地找出未排序整数数组中最长的连续元素序列。可以利用集合的数据结构特性实现 O(n) 时间复杂度的解决方法[^3]。 ```python def longestConsecutive(nums): nums_set = set(nums) max_length = 0 for num in nums_set: if num - 1 not in nums_set: current_num = num current_streak = 1 while current_num + 1 in nums_set: current_num += 1 current_streak += 1 max_length = max(max_length, current_streak) return max_length ``` #### 字符串中的所有字母异位词 (Find All Anagrams in a String) 该问要求在一个较长字符串中定位所有的短字符串的字母排列位置。滑动窗口技术配合字符计数能够有效解决问。 ```python from collections import defaultdict def findAnagrams(s, p): result = [] need = defaultdict(int) window = defaultdict(int) for c in p: need[c] += 1 left = right = valid = 0 start = length = 0 while right < len(s): c = s[right] right += 1 if c in need: window[c] += 1 if window[c] == need[c]: valid += 1 while right - left >= len(p): if valid == len(need): result.append(left) d = s[left] left += 1 if d in need: if window[d] == need[d]: valid -= 1 window[d] -= 1 return result ``` #### 和为 K 的子数组 (Subarray Sum Equals K) 这个问涉及计算一个数组中有多少个连续子数组其元素总和恰好等于 k 值。通过前缀和以及字典存储中间状态可达到线性时间效率。 ```python def subarraySum(nums, k): count = total_sum = 0 sums_dict = {0: 1} for num in nums: total_sum += num if (total_sum - k) in sums_dict: count += sums_dict.get(total_sum - k, 0) sums_dict[total_sum] = sums_dict.get(total_sum, 0) + 1 return count ``` 以上仅展示了部分 HOT 100 列表内的经典习及其基于 Python 实现的核心逻辑。更多具体案例可通过链接访问官方文档获取进一步学习资料[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值