[leetcode 64] Minimum Path Sum------從左上角到右下角的最小路徑值
阿新 • • 發佈:2018-12-24
Question:
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
分析:
題目意思是一個m*n的矩陣,求從左上角到右下角的最短路徑,只能向右走或是向下走。這道題跟機器人從左上角到右下角的路徑數目題類似,但是解法不能相同,如果仍舊採用遞迴法,速度會很慢,超時。
這道題的思路是採用動態規劃法分析,需要一個輔助陣列,無論在哪個位置,如何走到這個點,都記錄如果走到了這個點為止的路徑的最小值。
可以知道,如果走第一行或第一列,就是依次與前面的數相加。第i行第j列時候,就要考慮是從上面點走過來的還是從左邊點走過來,取其中最小值即可。
最後一個數據即為到右下角時候的路徑最小值。
程式碼如下:
<span style="font-size:14px;">class Solution { public: //vector<int> s; //int min = INT_MAX; public: int minPathSum(vector<vector<int>>& grid) { if(grid.size() == 0) return 0; else{ if(grid[0].size() == 0) return 0; } vector<vector<int>> min_path(grid); for(int i = 1; i < grid.size(); ++i){ min_path[i][0] += min_path[i-1][0]; } for(int i = 1; i < grid[0].size(); ++i){ min_path[0][i] += min_path[0][i-1]; } for(int i = 1; i < grid.size(); ++i){ for(int j = 1; j < grid[0].size(); ++j){ min_path[i][j] += min(min_path[i-1][j],min_path[i][j-1]); } } return min_path[ grid.size()-1][grid[0].size()-1]; /*int sum = 0; helper(grid,0,0,0,min); return min;*/ } //遞迴方法,時間超時 /* void helper(vector<vector<int>>& grid,int startm,int startn,int sum,int& min){ if(sum > min){ return; } if((grid.size()-startm) == 1){ for(int i = startn; i < grid[startm].size(); ++i){ sum += grid[startm][i]; } if(min > sum) min = sum; } else{ if((grid[0].size()-startn) == 1){ for(int i = startm; i < grid.size(); ++i){ sum += grid[i][startn]; } //s.push_back(sum); //return sum; if(min > sum) min = sum; } else{ // int left,down; if(grid.size() > startm+1) helper(grid,startm+1,startn,sum+grid[startm][startn],min); if(grid[0].size() > startn+1) helper(grid,startm,startn+1,sum+grid[startm][startn],min); } } }*/ };</span>