LeetCode | # 62. Unique Paths

62. Unique Paths

Description

描述:https://leetcode.com/problems/unique-paths/description/
题意:m列 × n行 的网格,从左上角第一个到右下角最后一个(只能往右和下这两个方向走),有多少条不重复的路径

Solution 1: (Java) 超时
class Solution {
    public int paths = 0;
    public int uniquePaths(int m, int n) {
        if (m == 1 && n == 1)
            return 1;
        backtracking(2, 1, m, n);
        backtracking(1, 2, m, n);
        return paths;
    }

    public void backtracking(int right, int down, int m, int n) {
        if (right == m && down == n) {
            paths++;
            return;
        }
        if (right > m || down > n)
            return;
        backtracking(right + 1, down, m, n);
        backtracking(right, down + 1, m, n);
    }
}
思路1
  • 刚开始想到的是回溯法,但是在 37/62 测试用例就超时了,得换思路了。
Solution 2: (Java)
class Solution {
    public int uniquePaths(int m, int n) {
        int[] dp = new int[m];
        Arrays.fill(dp, 1);
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j < m; ++j) {
                dp[j] += dp[j - 1];
            }
        }
        return dp[m - 1];
    }
}
思路2
  • solution 2 思路是动态规划,runtime 0ms;
  • 除了第一行和第一列(其中格子的到达路径都为1),到达其他格子的路径数目只与它上面的格子和左边的格子的路径数目有关,即状态转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],这里用一维数组就可以完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值