zoukankan      html  css  js  c++  java
  • Cllimbing Stairs [LeetCode 70]

    1- 问题描述

      You are climbing a stair case. It takes n steps to reach to the top.

      Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?


    2- 思路分析

      很自然的会想到递归,假设 n 级台阶有 T(n) 种不同走法。最后一步存在两种情况:剩下 1 级台阶,或者,剩下 2 级台阶。

      第一种情形,则前面 n-1 步有 T(n-1)种走法;

      第二种情形,则前面 n-2 步有 T(n-2)种走法。

      故有:T(n) = T(n-1) + T(n-2),其中 T(1) = 1, T(2) = 2。正好是 Fibonacci 数列!

      递归算法能缩短程序代码、提高编程效率,但是它也有致命的弱点:如果递归调用地层次过多甚至无休止的进行递归调用,将耗尽系统资源(栈满),出现“堆栈溢出错误”。所幸的是,一般可以用递归解决的问题也可以用循环解决!


    3- Python实现

     1 # -*- coding: utf-8 -*-
     2 # Climbing Stairs
     3 # 递归实现
     4 
     5 def climbStairs(n):
     6     if not n: return 0
     7     solv = []
     8     solv.extend([1, 2])    # T(1), T(2)
     9     if n >= 3:
    10         for i in range(2, n):
    11             solv.append(solv[i-1] + solv[i-2])
    12     return solv[n-1]
     1 # -*- coding: utf-8 -*-
     2 # Climbing Stairs
     3 # 循环实现
     4 
     5 def climbStairs(n):
     6     if not n: return 0
     7     if n == 1: return 1
     8     if n == 2: return 2
     9     
    10     a, b = 1, 2
    11     for i in range(2, n):
    12         a, b = b, a + b
    13     return b

      

  • 相关阅读:
    Retrofit2源码分析
    Android8.0硬件加速的重绘流程
    Android单元测试
    rand5->rand7,rand7->rand10
    快速排序的随机化版本
    快速排序
    亦或实现交换
    在最坏情况下,找到n个元素中第二小的元素需要n+lgn-2次比较
    3*n/2时间内求出最大最小值
    基数排序
  • 原文地址:https://www.cnblogs.com/freyr/p/4499847.html
Copyright © 2011-2022 走看看