【Leetcode】不一樣路徑

題目:編程

 

 

思路一:數組

動態規劃。建立一個mxn的二維數組,數組內存儲到達每一個點的路徑數量N。動態規劃推導式,N(i,j) = N(i-1, j) + N(i, j-1)。spa

 

思路二:code

從左上角出發,終點是右下角,每次只能向右走(R)或者向下走(D)。總共須要向右移動 n-1 次,向下移動 m-1 次,一共要移動 m+n-2 次。求從起點到終點的全部路徑,問題能夠轉換爲,有 m+n-2 個抽屜,有 n-1 把鑰匙,每一個抽屜最多隻能放1把鑰匙,有多少种放置方案。排列組合問題。blog

編程計算排列組合,注意一點,分子和分母的階乘運算致使int類型的變量溢出內存

class Solution {
public:
    int uniquePaths(int m, int n) {
        double result = 1.0;
        int remain = 1;
        
        int num = min(m-1, n-1);
        
        for(int i = 0; i < num; ++i) {
            if( ((m+n-2-i)%(i+1)) == 0 )    // 單項實現整除
                result *= ((m+n-2-i)/(i+1));
            else {
                if( result/(i+1) > int(result/(i+1)) )   // 前幾項的積可以整除(i+1)
                    result /= (i+1);
                else                       // 前幾項的積沒法整除(i+1)
                    remain *= (i+1);
                
                result *= (m+n-2-i);
            }
        }
        
        result /= remain;
        return result;
    }
};
相關文章
相關標籤/搜索