首页 > 编程语言 >LeetCode-Python-3154. 到达第 K 级台阶的方案数(DFS + 数学)

LeetCode-Python-3154. 到达第 K 级台阶的方案数(DFS + 数学)

时间:2024-08-20 12:52:37浏览次数:15  
标签:第一种 台阶 Python Alice DFS jump 3154 操作 执行

给你有一个 非负 整数 k 。有一个无限长度的台阶,最低 一层编号为 0 。

Alice 有一个整数 jump ,一开始值为 0 。Alice 从台阶 1 开始,可以使用 任意 次操作,目标是到达第 k 级台阶。假设 Alice 位于台阶 i ,一次 操作 中,Alice 可以:

  • 向下走一级到 i - 1 ,但该操作 不能 连续使用,如果在台阶第 0 级也不能使用。
  • 向上走到台阶 i + 2jump 处,然后 jump 变为 jump + 1 。

请你返回 Alice 到达台阶 k 处的总方案数。

注意,Alice 可能到达台阶 k 处后,通过一些操作重新回到台阶 k 处,这视为不同的方案。

示例 1:

输入:k = 0

输出:2

解释:

2 种到达台阶 0 的方案为:

  • Alice 从台阶 1 开始。
    • 执行第一种操作,从台阶 1 向下走到台阶 0 。
  • Alice 从台阶 1 开始。
    • 执行第一种操作,从台阶 1 向下走到台阶 0 。
    • 执行第二种操作,向上走 20 级台阶到台阶 1 。
    • 执行第一种操作,从台阶 1 向下走到台阶 0 。

示例 2:

输入:k = 1

输出:4

解释:

4 种到达台阶 1 的方案为:

  • Alice 从台阶 1 开始,已经到达台阶 1 。
  • Alice 从台阶 1 开始。
    • 执行第一种操作,从台阶 1 向下走到台阶 0 。
    • 执行第二种操作,向上走 20 级台阶到台阶 1 。
  • Alice 从台阶 1 开始。
    • 执行第二种操作,向上走 20 级台阶到台阶 2 。
    • 执行第一种操作,向下走 1 级台阶到台阶 1 。
  • Alice 从台阶 1 开始。
    • 执行第一种操作,从台阶 1 向下走到台阶 0 。
    • 执行第二种操作,向上走 20 级台阶到台阶 1 。
    • 执行第一种操作,向下走 1 级台阶到台阶 0 。
    • 执行第二种操作,向上走 21 级台阶到台阶 2 。
    • 执行第一种操作,向下走 1 级台阶到台阶 1 。

提示:

  • 0 <= k <= 109

第一种思路:

每走一步之后,新的子问题跟原问题相比,规模更小且类型相同,因此可以用 DFS 进行递归处理。

递归的结束条件是,当 i 比 k + 1大时,终止搜索。这是再往后必不可能到达 k。

剩下的就是按照提议翻译即可,注意用两个参数记录上一步有没有往下走, 以及跳了几次。

时间复杂度:O(log(k) * log(k))

空间复杂度:O(log(k) * log(k))

class Solution:
    def waysToReachStair(self, k: int) -> int:
        
        @cache
        def dfs(i, last_step_down, jump):
            res = 0
            if i > k + 1:
                return 0
            if i == k:
                res = 1
            if not last_step_down:
                res += dfs(i - 1, True, jump)
            res += dfs(i + 2 ** jump, False, jump + 1)
            return res
        return dfs(1, False, 0)

第二种思路:

其实这道题也还可以从数学的角度进行分析,但是难度较大,没有准备过基本不可能在面试中凭空想出来。

已知我们一开始从 1 出发,可以进行 i 次减 1 操作,以及 j 次 jump 操作,最后需要到达 k。

可得:1(起点) + (2^0 + 2^1 + .. + 2^(j - 1)) - i = k

即 2^j - i = k

题目另有一个要求,是说 i 不能连续使用,即 i 必须穿插在 j 之间。

如果我们有 j 次 jump,那么就会有 j + 1 个空挡可以插入 i。

所以对于每一组(i, j) 来说,它们会形成的答案就是 Combination(j + 1, i)。

class Solution:
    def waysToReachStair(self, k: int) -> int:
        # 1 + 2^0 + 2^1 + .. + 2^(j - 1) - i = k
        # i <= j + 1
        res = 0
        for j in range(30): # 2 ^ 30 > 10 ^ 9
            i = 2 ** j - k
            if 0 <= i <= j + 1:
                res += comb(j + 1, i)
        return res

时间复杂度:O(1)

空间复杂度:O(1)

标签:第一种,台阶,Python,Alice,DFS,jump,3154,操作,执行
From: https://blog.csdn.net/qq_32424059/article/details/141355469

相关文章

  • 2024年全国青少年信息素养大赛国赛PYTHON组(C++做法)
    目录前提第一题第二题第三题第四题第五题:第六题前提鄙人是C++学生,所以将PYTHON题做为C++题,还请各位多多海涵!!!部分芝士来自度娘和其它网站温馨提示:题目顺序可能不同,请各位仔细浏览! 第一题题目描述蓝蓝最近学到了一些单词,比如orange(橘子),apple(苹果),pear(梨)。......
  • Python之因子分析详细步骤
    1.数学原理1.1数学模型1.2正交因子模型假设注意:下面的推导都是基于这一假设。因此,这里的模型都是属于正交因子模型。1.3正交因子模型的协方差结构1.4各类方差贡献的介绍    在1.3正交因子模型的协方差结构中,我们介绍了“方差贡献”,下面给出关于“方差贡献”......
  • 四:《Python基础语法汇总》— 列表&元组&集合
    一:列表​列表是Python中最基本的数据类型之一,是可以存放多个多种元素的容器​列表是Python中序列的一种,是一个有序可变序列​由于列表是可变序列,所以可以对其里面的内容进行修改,无需重新开辟空间存储1.下标与切片:​列表中也可以应用下标索引和切片,与在字符串中的应用......
  • 【有源码】基于Python的股票数据分析与价格预测TensorFlow深度学习框架和长短期记忆网
    注意:该项目只展示部分功能,如需了解,文末咨询即可。本文目录1.开发环境2系统设计2.1设计背景2.2设计内容3系统页面展示3.1预测页面3.2可视化页面3.3管理页面3.4功能展示视频4更多推荐5部分功能代码5.1爬虫部分代码5.2预测部分代码1.开发环境开发语......
  • 基于python学生兼职平台系统的设计与实现-附源码160938
    摘 要当今人类社会已经进入信息全球化和全球信息化、网络化的高速发展阶段。丰富的网络信息已经成为人们工作、生活、学习中不可缺少的一部分。人们正在逐步适应和习惯于网上贸易、网上购物、网上支付、网上服务和网上娱乐等活动,人类的许多社会活动正在向网络化发展。兼职......
  • 基于python小说APP的设计与实现-附源码
    摘 要大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在小说在线阅读的需求下,开发一款小说APP,将复杂的系统进行拆分,能够实现对需求的变化快速响应、系统稳定性的保障,能保证平......
  • 正则表达式入门:Python ‘ re ‘ 模块详解
    正则表达式(RegularExpression,简称re)是一种强大而灵活的工具,广泛用于字符串匹配、替换和分割等操作,尤其在处理网页爬虫数据时非常有用。Python提供了"re" 模块来支持正则表达式的使用,本文将结合常见的用法和示例,带你快速入门。正则表达式的常用方法匹配字符串1.'sea......
  • python列表方法-insert、pop、remove
    1.pop方法python中pop方法从列表中删除一个元素(默认是最后一个元素),并且返回这个元素a=[100,200,300,400]a.pop()400a[100,200,300]列表a调用pop方法,删除最后一个元素400返回。2.insert方法python中insert方法用于将一个对象插入列表a=[100,200,300,400]a.inse......
  • Python 面向对象(笔记)
    一、函数的概念函数用于在程序中分离不同的任务,是模块化程序设计的基本构成单位,是对程序逻辑进行结构化或过程化的一种编程方法函数定义好后,可以反复调用使用,这样就可以避免重复编写代码,而且,功能如果需要修改,只要更改函数定义就可以,维护方便1.1使用函数的优点 实现结......
  • 详解Python 66 个内置函数!附代码
    Python有许多内置函数,共有66个。以下是这些内置函数的详细解释和示例代码:1.abs(x): 返回一个数的绝对值。x = -10print(abs(x))  # 输出:102.all(iterable): 如果可迭代对象中所有元素都为真,则返回True;否则返回False。iterable = [True, True, False]print(al......