达内烟台中心 > 达内新闻
python算法:如何解决楼梯台阶问题(1)
- 发布:烟台达内
- 来源:烟台达内
- 时间:2019-01-28 16:19
烟台达内的小编总结,让我们考虑以下问题。
有一个有N个台阶的楼梯,你一次可以爬1或2个台阶。
给定N,编写一个函数,返回爬完楼梯的方式数量。步骤的顺序很重要。
例如,如果N是4,那么有5种方式:
1,1,1,1
2,1,1
1,2,1
1,1,2
2,2
如果规定的不是一次只能爬1或2步,而是可以使用正整数X集合内的任意数字爬楼梯,那会怎么样?例如,如果X = {1,3,5},则表示一次爬升1,3或5阶楼梯。
解决方案
从一些测试案例开始总是好的做法。让我们从小的案例开始,看看能否找到某种规律。
N = 1,1种爬楼方式:
N = 2,2种爬楼方式:,
N = 3,3种爬楼方式:,,
N = 4,5种爬楼方式:,,,,

你有没有注意到什么?请看N = 3时,爬完3阶楼梯的方法数量是3,基于N = 1和N = 2.存在什么关系?
爬完N = 3的两种方法是首先达到N = 1,然后再往上爬2步,或达到N = 2再向上爬1步。所以 f(3) = f(2) + f(1)。
这对N = 4是否成立呢?是的,这也是成立的。因为我们只能在达到第三个台阶然后再爬一步,或者在到了第二个台阶之后再爬两步这两种方式爬完4个台阶。所以f(4) = f(3) + f(2)。
所以关系如下: f(n) = f(n - 1) + f(n - 2),且f(1) = 1和f(2) = 2.这就是斐波那契数列。
def fibonacci(n):
if n 0)
cache += 1 if i in X else 0
return cache
现在时间复杂度为O(N * |X|),空间复杂度为O(N)。
蛮力破解
对于这个问题野蛮的解决方案是遍历S中每个单词大小的窗口并检查它们是否是回文,如下所示:
from collections import Counter
def is_anagram(s1, s2):
return Counter(s1) == Counter(s2)
def anagram_indices(word, s):
result =
for i in range(len(s) - len(word) + 1):
window = s
if is_anagram(window, word):
result.append(i)
return result
以上就是烟台达内给大家做的内容详解,更多关于IT的学习,请继续关注烟台达内
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 哈尔滨
- 济南
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 长沙
- 昆明
- 太原
- 无锡
- 石家庄
- 南宁
- 佛山
- 珠海
- 宁波
- 保定
- 呼和浩特
- 洛阳
- 烟台
- 运城
- 潍坊
python算法:如何解决楼梯台阶问题(1)
- 发布:烟台达内
- 来源:烟台达内
- 时间:2019-01-28 16:19
烟台达内的小编总结,让我们考虑以下问题。
有一个有N个台阶的楼梯,你一次可以爬1或2个台阶。
给定N,编写一个函数,返回爬完楼梯的方式数量。步骤的顺序很重要。
例如,如果N是4,那么有5种方式:
1,1,1,1
2,1,1
1,2,1
1,1,2
2,2
如果规定的不是一次只能爬1或2步,而是可以使用正整数X集合内的任意数字爬楼梯,那会怎么样?例如,如果X = {1,3,5},则表示一次爬升1,3或5阶楼梯。
解决方案
从一些测试案例开始总是好的做法。让我们从小的案例开始,看看能否找到某种规律。
N = 1,1种爬楼方式:
N = 2,2种爬楼方式:,
N = 3,3种爬楼方式:,,
N = 4,5种爬楼方式:,,,,

你有没有注意到什么?请看N = 3时,爬完3阶楼梯的方法数量是3,基于N = 1和N = 2.存在什么关系?
爬完N = 3的两种方法是首先达到N = 1,然后再往上爬2步,或达到N = 2再向上爬1步。所以 f(3) = f(2) + f(1)。
这对N = 4是否成立呢?是的,这也是成立的。因为我们只能在达到第三个台阶然后再爬一步,或者在到了第二个台阶之后再爬两步这两种方式爬完4个台阶。所以f(4) = f(3) + f(2)。
所以关系如下: f(n) = f(n - 1) + f(n - 2),且f(1) = 1和f(2) = 2.这就是斐波那契数列。
def fibonacci(n):
if n 0)
cache += 1 if i in X else 0
return cache
现在时间复杂度为O(N * |X|),空间复杂度为O(N)。
蛮力破解
对于这个问题野蛮的解决方案是遍历S中每个单词大小的窗口并检查它们是否是回文,如下所示:
from collections import Counter
def is_anagram(s1, s2):
return Counter(s1) == Counter(s2)
def anagram_indices(word, s):
result =
for i in range(len(s) - len(word) + 1):
window = s
if is_anagram(window, word):
result.append(i)
return result
以上就是烟台达内给大家做的内容详解,更多关于IT的学习,请继续关注烟台达内
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 厦门
- 哈尔滨
- 济南
- 福州
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 大连
- 长沙
- 昆明
- 温州
- 太原
- 南昌
- 无锡
- 石家庄
- 南宁
- 中山
- 兰州
- 佛山
- 珠海
- 宁波
- 贵阳
- 保定
- 呼和浩特
- 东莞
- 洛阳
- 潍坊
- 烟台
- 运城