zoukankan      html  css  js  c++  java
  • 62. Unique Paths && 63 Unique Paths II

    https://leetcode.com/problems/unique-paths/

    这道题,不利用动态规划基本上规模变大会运行超时,下面自己写得这段代码,直接暴力破解,只能应付小规模的情形,当23*12时就超时了:

    class Solution {
    public:
    //    Solution():dp1(m,vector<int>(n,-1)),dp2(m,vector<int>(n,-1)){
            
    //    }
        int uniquePaths(int m, int n) {
            helper(1,1,m,n,dp1,dp2);
            return res;
            
        }
        void helper(int row,int col,int m,int n,vector<vector<int>>& dp1,vector<vector<int>>& dp2){
            if(row==m && col==n){
                res++;
                return;
            }
            if(row<m&&col<n){
                helper(row+1,col,m,n,dp1,dp2);
                helper(row,col+1,m,n,dp1,dp2);
            }
            else if(row==m && col<n){
                helper(row,col+1,m,n,dp1,dp2);
            }
            else if(row<m && col==n){
                helper(row+1,col,m,n,dp1,dp2);
            }
        }
        
    private:
        vector<vector<int>> dp1;
        vector<vector<int>> dp2;
        int res;
    };
    View Code

     利用动态规划来做,储存一个二维数组:vector<vector<int>> dp,用来保存每一个位置的走法总数:

    则dp[i][j]=dp[i-1][j]+dp[i][j-1],代码如下:

    class Solution {
    public:
        int uniquePaths(int m, int n) {
            vector<vector<int>> dp(m+1,vector<int>(n+1,-1));
            helper(1,1,m,n,dp);
            return dp[m][n];
        }
        void helper(int row,int col,int m,int n,vector<vector<int>>& dp){
            for(int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                    if(i==1||1==j)
                        dp[i][j]=1;
                    else{
                        dp[i][j]=dp[i-1][j]+dp[i][j-1];
                    }
                }
            }
        }
    };

    63 Unique Paths II https://leetcode.com/problems/unique-paths-ii/ 

    递归公式仍旧是上一个,不过遇到障碍要作相应处理(置为零)

    class Solution {
    public:
        int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
            int row=obstacleGrid.size();
            int col=obstacleGrid[0].size();
            vector<vector<int>> dp(row,vector<int>(col,-1));
            for(int i=0;i<row;i++){
                for(int j=0;j<col;j++){
                    if(obstacleGrid[i][j]==1){
                        dp[i][j]=0;
                    }
                    else{
                        if(i==0&&0==j){
                            dp[i][j]=1;
                        }
                        else if(0==i && j>0){
                            dp[i][j]=dp[i][j-1];
                        }
                        else if(j==0&& i>0){
                            dp[i][j]=dp[i-1][j];
                        }
                        else{
                            dp[i][j]=dp[i-1][j]+dp[i][j-1];
                        }
                    }
                }
            }
            return dp[row-1][col-1];        
        }
    };
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    LeetCode 654. Maximum Binary Tree
    LeetCode 680. Valid Palindrome II
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 665. Non-decreasing Array
    LeetCode 604. Design Compressed String Iterator
    LeetCode Largest Palindrome Product
    LeetCode 605. Can Place Flowers
    LeetCode Sum of Square Numbers
    LeetCode Maximum Average Subarray I
    LeetCode 673. Number of Longest Increasing Subsequence
  • 原文地址:https://www.cnblogs.com/chess/p/5282511.html
Copyright © 2011-2022 走看看