LeetCode《不同路径》的解题思考过程

Posted adventure.Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode《不同路径》的解题思考过程相关的知识,希望对你有一定的参考价值。

一、题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

二、解决办法

  1. 从数学角度

拿到此题,可能不少朋友会想起来高中学习组合数学时做过,本人也是第一反应直接进行组合数计算不是很快,基本上只需要0ms解决问题,但由于细节问题,分析失误导致结果不对,然后开始了其他思路。

在这里插入图片描述
数学功底较差或者没敢去想的朋友也别慌,还可以进行以下策略。

  1. 暴力办法 进行搜索DFS
// int res  =0;
    // void dfs(int row,int col,int m,int n){// 1,1开始
    //     if(row==m&&col==n){
    //           res++;
    //           return;
    //     }
    //     if(row>m||col>n||row<1||col<1){
    //         return;
    //     }
    //     dfs(row+1,col,m,n);
    //         dfs(row,col+1,m,n);
    //             // dfs(row-1,col,m,n);
    //             //     dfs(row,col-1,m,n);
    // }

很遗憾,只能通过41个用例,超时了,接着来第三种办法
在这里插入图片描述

  1. 递归

很容易发现这样一个简单的递归关系,你有两种办法一种是向下另外一种是向右也就得到这样一个递推式 recursion(m,n) =
recursion(m-1,n)+recursion(m,n-1) ,可以联系爬楼梯一样的想法。

// if(n==1||m==1){
        //     return 1;
        // }
        // return uniquePaths(n-1,m)+uniquePaths(n,m-1);

但效果和DFS效果一样,于是可以思考记忆优化,于是进行了记忆优化后,解决问题,虽然时间复杂度比较低。

if(n==1||m==1){
            cache[m][n] =1;
            return 1;
        }else {

            // 二维数组存储
            int chioce1=0,chioce2=0;
            if(cache[m-1][n]!=0){
                    chioce1=cache[m-1][n];
            }
            else
                {
                    chioce1 = uniquePaths(m-1,n);
                    cache[m-1][n] = chioce1;
                }  
            if(cache[m][n-1]!=0){
                chioce2=cache[m][n-1];
            }
             else{
                 chioce2 = uniquePaths(m,n-1);
                 cache[m][n-1] = chioce2;
             }        
             return chioce1+chioce2;
        }
  1. DP
    采用DP方程记录递推式,其实就是采用递归思想完成,结果时间复杂度和递归记忆优化差不多的。
 /*
         1 1 1  1 1  1  1  1
         1 2 3  4 5  6  7  8 
         1 3 6 10 15 21 28 36
        */
        int [][]dp = new int[m][n]; 
        Arrays.fill(dp[0],1);
        for(int i=0;i<m;i++)
          dp[i][0]=1;

        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                dp[i][j]=dp[i][j-1]+dp[i-1][j];
            }
        }  
           
        return dp[m-1][n-1];   

以上是关于LeetCode《不同路径》的解题思考过程的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode62. 不同路径(dp)

leetcode(62)不同路径

leetcode1001. 网格照明 代码优化记录

LeetCode Unique Paths

LeetCode 24. 两两交换链表中的节点

LeetCode - 19 - 删除链表的倒数第N个节点 - Java