栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode70.爬楼梯(简单)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode70.爬楼梯(简单)



思路一:记忆化dfs

class Solution {
public:
    unordered_map ump;
    int dfs(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        if (ump.count(n)) return ump[n];
        ump[n] = dfs(n - 2) + dfs(n - 1);
        return ump[n];
    }
    int climbStairs(int n) {

        return dfs(n);
    }
};

思路二:dp ---------->O(n)
具体:dp[i]表示到达i阶需要的步数 dp[i] = dp[i-1]+dp[i-2]

class Solution {
public:
    int climbStairs(int n) {
        
        if (n == 1) return 1;
        if (n == 2) return 2;
        int a = 1, b = 2, tmp;
        for (int i = 3; i <= n; ++i) {
            tmp = a;
            a = b;
            b = tmp + b;
        } 
        return b;
    }
};

思路三:时间优化,矩阵快速幂 O(logn)

class Solution {
public:
    //矩阵快速幂,结果为求[1 1][1 0]的n次幂左上角的元素
    vector> multiply(vector>matrix1, vector>matrix2) {
        vector> ans(2, vector(2));  
        for (int i = 0; i < 2; ++i) {
            for (int j = 0; j < 2; ++j) 
                ans[i][j] = matrix1[i][0] * matrix2[0][j] + matrix1[i][1] * matrix2[1][j];
        }
        return ans;
    }
    vector> matrixpow(vector>& matrix, int n) {
        vector> ans = {{1, 0}, {0, 1}}; //
        while (n) {
            if (n & 1) {
                ans = multiply(ans, matrix);
            }
            matrix = multiply(matrix, matrix);
            n >>= 1;
        }
        return ans;
    }
    int climbStairs(int n) {
        vector> matrix = {{1, 1}, {1, 0}};
        auto result = matrixpow(matrix, n); //
        return result[0][0];
    }
};

易错点
1:搞一个单位矩阵,才能与矩阵相乘!!!
2:结果可能没超int, 但是相乘就会越界,所以临时矩阵都要声明为long long类型!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649318.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号