一颗红心多种解法!响应掘金号召3.3.2|刷题打卡

231 阅读1分钟

一、题目描述:

二、思路分析:

动态规划

状态表示 dp[i][j]表示第i行第j列的位置有几种到达的方法

状态计算 dp[i][j]由左边和上边组成

状态转移方程 dp[i][j] = dp[i][j - 1] + dp[i - 1][j];

根据题意,可以将问题转换成一个图的遍历问题。

深度优先遍历

可以使用一个栈存储点,每次出栈一个点,如果其向右向左的点存在,就入栈,每次遍历到 (m - 1. n - 1)这个点是ret++,最后return ret

广度优先遍历

可以使用一个队列存储点,每次出队一个点,如果其向右向左的点存在,就入队,每次遍历到 (m - 1. n - 1)这个点是ret++,最后return ret

三、AC 代码:

class Solution {
public:
    int uniquePaths(int m, int n) {
        int dp[m][n];
        for(int i = 0; i < m; i ++){
            for(int j = 0; j < n ; j ++){
                dp[i][j] = 0;
                if(i == 0 && j == 0)dp[0][0] = 1;
                else if(i == 0 && j != 0)dp[i][j] = dp[i][j - 1];
                else if(i != 0 && j == 0)dp[i][j] = dp[i - 1][j];
                else{
                    dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
                }
            }
        }
        return dp[m - 1][n - 1];
    }
};

四、总结:

这道题还可以通过数学知识来解决,不过这个应该也不算算法的范畴了,掘友们可以自行挖掘。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情