日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode unique-paths

發布時間:2024/7/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode unique-paths 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://blog.csdn.net/linhuanmars/article/details/22126357

原題鏈接:?http://oj.leetcode.com/problems/unique-paths/?

這道題是比較典型的動態規劃的題目。模型簡單,但是可以考核動態規劃的思想。

我們先說說brute force的解法,比較容易想到用遞歸,到達某一格的路徑數量等于它的上面和左邊的路徑數之和,結束條件是走到行或者列的邊緣。因為每條路徑都會重新探索,時間復雜度是結果數量的量級,不是多項式的復雜度。代碼如下:?

[java]?view plaincopy
  • public?int?uniquePaths(int?m,?int?n)?{??
  • ????return?helper(1,1,m,n);??
  • }??
  • private?int?helper(int?row,?int?col,?int?m,?int?n)??
  • {??
  • ????if(row==m?&&?col==n)??
  • ????????return?1;??
  • ????if(row>m?||?col>n)??
  • ????????return?0;??
  • ????return?helper(row+1,col,m,n)+helper(row,col+1,m,n);??
  • }??
  • 上面的代碼放到LeetCode中跑會超時,因為不是多項式量級的。其實上一步中遞推式已經出來了,就是res[i][j]=res[i-1][j]+res[i][j-1],這樣我們就可以用一個數組來保存歷史信息,也就是在i行j列的路徑數,這樣每次就不需要重復計算,從而降低復雜度。用動態規劃我們只需要對所有格子進行掃描一次,到了最后一個得到的結果就是總的路徑數,所以時間復雜度是O(m*n)。而對于空間可以看出我們每次只需要用到上一行當前列,以及前一列當前行的信息,我們只需要用一個一維數組存上一行的信息即可,然后掃過來依次更替掉上一行對應列的信息即可(因為所需要用到的信息都還沒被更替掉),所以空間復雜度是O(n)(其實如果要更加嚴謹,我們可以去行和列中小的那個,然后把小的放在內層循環,這樣空間復雜度就是O(min(m,n)),下面的代碼為了避免看起來過于繁雜,就不做這一步了,有興趣的朋友可以實現一下,比較簡單,不過代碼有點啰嗦)。實現的代碼如下: [java]?view plaincopy
  • public?int?uniquePaths(int?m,?int?n)?{??
  • ????if(m<=0?||?n<=0)??
  • ????????return?0;??
  • ????int[]?res?=?new?int[n];??
  • ????res[0]?=?1;??
  • ????for(int?i=0;i<m;i++)??
  • ????{??
  • ????????for(int?j=1;j<n;j++)??
  • ????????{??
  • ???????????res[j]?+=?res[j-1];??
  • ????????}??
  • ????}??
  • ????return?res[n-1];??
  • }??
  • 上面的方法用動態規劃來求解,如果我們仔細的看這個問題背后的數學模型,其實就是機器人總共走m+n-2步,其中m-1步往下走,n-1步往右走,本質上就是一個組合問題,也就是從m+n-2個不同元素中每次取出m-1個元素的組合數。根據 組合 的計算公式,我們可以寫代碼來求解即可。代碼如下: [java]?view plaincopy
  • public?int?uniquePaths(int?m,?int?n)?{??
  • ????double?dom?=?1;??
  • ????double?dedom?=?1;??
  • ????int?small?=?m<n??m-1:n-1;??
  • ????int?big?=?m<n??n-1:m-1;??
  • ????for(int?i=1;i<=small;i++)??
  • ????{??
  • ????????dedom?*=?i;??
  • ????????dom?*=?small+big+1-i;??
  • ????}??
  • ????return?(int)(dom/dedom);??
  • }??
  • 上面的代碼求解了組合的結果,只需要做一次行或者列的掃描,所以時間復雜度是O(min(m,n)),而空間復雜度是O(1)。比起上面的兩種解法更優。不過這里有個弊端,就是如果代碼中的dom和dedom如果不是double,而是用int,那么會很容易越界,因為這是一個階乘,所以大家在面試中討論這種方法要注意和提及越界的問題。
    上面介紹了幾種方法來求解這個問題,其實都是比較簡單的模型,只是提供了不同的思路。 Unique Paths II 是這道題的擴展,給機器人增加了障礙,有興趣的朋友可以聯系一下。 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Leetcode unique-paths的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。