力扣 64.最小路徑和 Minimum Path Sum
阿新 • • 發佈:2020-07-23
動態規劃題一直是我的弱項,這道題之前應該是遇到過,但那時自己想不出來,就看了看題解,沒有做。今天力扣的每日一題又遇到了,正好做一下。
力扣 64.最小路徑和 Minimum Path Sum 難度:中等
算是比較簡單的動規題,f[i][j]=min(f[i][j-1],f[i-1][j]),(邊界情況要特殊考慮)
空間複雜度優化,每次只儲存上一行的dp值,於是用一維的f就可以了。(這種方法應該也是之前在什麼地方看題解看到的,不然我自己肯定想不出來)。
自己寫的程式碼如下,一開始在用第一行對f[i]進行初始化時忘記加上前一項f[i-1]了,就直接f[i]=grid[0][i],導致第一次執行不對,後來修改了之後過了。
class Solution { public: int minPathSum(vector<vector<int>>& grid) { int row=grid.size(),col=grid[0].size(); vector<int> f(col,0);//每一列最小值 int i,j; f[0]=grid[0][0]; for(i=1;i<col;i++) { f[i]=grid[0][i]+f[i-1];//到達第一行的各點,只能從左邊來 } for(i=1;i<row;i++) { for(j=0;j<col;j++) { if(j==0) { f[j]=f[j]+grid[i][j];//相當於從上走到[i,j]處的路徑和 continue; } f[j]=grid[i][j]+min(f[j],f[j-1]);//選擇上方和左側的最小值,加上當前值 } } return f[col-1]; } };
對照了一下官方的題解,前面還需要加一個對grid.size()為0、或grid[0].size()為0的判斷。