題目:編程
思路一:數組
動態規劃。建立一個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; } };