題目
給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有路徑中最小的路徑和。
例子:
給定m如下:
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12。
解法1
思路:使用動態規劃,定義dp[m][n], m ,n 分別代表矩陣的行和列數 dp[i][j] 表示從左上角到矩陣(i,j)位置是的最短路徑和。則可知 到(i,j)位置有兩種情況:1)由(i-1,j)向下走,2)由(i,j-1)向右走,所以dp[i][j]=math.min(dp[i-1][j],dp[i][j-1])+m[i][j];對於dp[0][j] 只能由 dp[0][j-1] 向右走,dp[i][0] 只能由 dp[i-1][0] 向下走。所以 dp[0][j]=dp[0][j-1]+m[0][j], dp[i][0]=dp[i-1][0]+m[i][0].
**:
public static int shortestroad(int arr)
for(int j=1;j0].length;j++)
for(int i=1;ilength;i++)
for(int j=1;j0].length;j++)
return dp[arr.length-1][arr[0].length-1];
}
解法2(優化解法1)
思路:
解法1中使用dp陣列的空間大小為m*n,其實可以對dp陣列的空間壓縮至n,定義大小為n的dp陣列,對於第一行,dp[i]=dp[i-1]+m[0][i],在求第二行中的 dp[i] 時可以覆蓋第一行 dp[i] ,第二行dp[i]=math.min(dp[i],dp[i-1])+m[i][j]。
**
public static int shortestroad1(int arr)
for(int i=1;ilength;i++)
}
return dp[arr[0].length-1];
}
筆試面試演算法經典 矩陣的最短路徑和(Java)
給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有路徑中最小的路徑和。例子 給定m如下 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12。解法1 思...
面試演算法經典問題
1.對序列排序 按出現的次數多少排序 次數多在前 次數少在後?分析思路 序列按次數降序排序 序列計數 字典排序 字典反序 輸出序列 序列計數 採用字典 計數累加 字典排序 使用 sorted iterable cmp key reverse 函式 reverse 排序規則,reverse true ...
鄰接矩陣 最短路徑演算法
floyd演算法 思路 遍歷計算 i 點 經過 k 點 到 j 點 的最小路徑值 動態規劃思路 缺點 時間複雜度高,不能解決負邊情況 輸入樣例 4 81 2 2 1 3 6 1 4 4 2 3 3 3 1 7 3 4 1 4 1 5 4 3 12 輸出樣例 1 2 2 1 3 5 1 4 4 2 1...