zoukankan      html  css  js  c++  java
  • LeetCode 70 Climbing Stairs(爬楼梯)(动态规划)(*)

    翻译

    你正在爬一个楼梯。

    它须要n步才干究竟顶部。

    每次你能够爬1步或者2两步。

    那么你有多少种不同的方法爬到顶部呢?

    原文

    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?

    分析

    动态规划基础题,首先设置3个变量用于转换:

    int dp1 = 1, dp2 = 2, dpWay = 0;

    依据题意,一次仅仅能是一步或两步。所以当n等于2时,有两种走法:1+1,2。

    if (n <= 1) return dp1;
    if (n == 2) return dp2;

    从3開始,由于能够直接获得它的步数结果。所以直接写成:

    while ((n--)-2) {
    }

    终于里面的变化方式为:

    dpWay = dp1 + dp2;
    dp1 = dp2;
    dp2 = dpWay;

    上一篇博客: LeetCode 206 Reverse Linked List(反转链表)(四步将递归改写成迭代)(*) ,介绍了怎样将递归改写成迭代,看过的童鞋应该会认为很easy的。那么这里再来转换一次:

    int climbStairsIter(int n,  int dpWay,int dp1, int dp2) {
        if (n <= 1) return dp1;
        if (n == 2) return dp2;
        if ((n--) - 2) {
            dpWay = dp1 + dp2;
            dp1 = dp2;
            dp2 = dpWay;
            return climbStairsIter(n, dpWay, dp1, dp2);
        }
        else return dpWay;
    }
    
    int climbStairs(int n) {
        return climbStairsIter(n, 0,1,2);
    }

    由于这里的參数涉及到运行前面顺序,所以不妨单独列出来了,只是这样看来略不简洁呐。

    代码

    class Solution {
    public:
        int climbStairs(int n) {
    
            int dp1 = 1, dp2 = 2, dpWay = 0;
            if (n <= 1) return dp1;
            if (n == 2) return dp2;
    
            while ((n--) - 2) {
                dpWay = dp1 + dp2;
                dp1 = dp2;
                dp2 = dpWay;
            }
            return dpWay;
        }
    };
  • 相关阅读:
    json
    网页版 treeview使用中遇到的问题
    随机获取一条数据
    oracle
    发送邮件
    DataGrid列的合并
    python简介
    SQLSERVER
    Maven 基础
    Maven 构建jar包
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7300444.html
Copyright © 2011-2022 走看看