[] 63.ユニークなパスII LeetCode異なる経路II(中)(JAVA)
トピック住所:https://leetcode-.com/problems/unique-paths-ii/
件名の説明:
ロボットは、(下図の「スタート」マーク)amxnグリッドの左上隅に位置しています。
ロボットは、任意の時点でダウンまたは右に移動することができます。ロボットは、(下図の「完了」マーク)グリッドの右下隅に到達しようとしています。
いくつかの障害がグリッドに追加された場合は今検討してください。どのように多くのユニークなパスがあるだろうか?
障害物や空きスペースは、グリッドにそれぞれ1と0としてマークされています。
注:m及びnは、ほとんど100であろう。
例1:
Input:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right
効果の対象に
左コーナーMXNグリッドに位置ロボットは(以下、「スタート」と表示されたポイントのフィギュアを開始します)。
ロボットは右または下に一歩を移動することができます。(「完了」と表示され、次の図の)グリッドの右下隅に到達しようとしているロボット。
今すぐグリッドの障害物を考慮してください。が存在しますので、どのように多くの異なるパス上からは、右下隅に左?
問題解決のアプローチ
図1に示すように、背面から横断動的プログラミング、
2、スキップ、1遭遇する、または前面に置き、値が追加されています
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
if (obstacleGrid.length == 0 || obstacleGrid[0].length == 0 || obstacleGrid[obstacleGrid.length - 1][obstacleGrid[0].length - 1] == 1) return 0;
int[][] dp = new int[obstacleGrid.length][obstacleGrid[0].length];
dp[obstacleGrid.length - 1][obstacleGrid[0].length - 1] = 1;
for (int i = obstacleGrid.length - 1; i >= 0; i--) {
for (int j = obstacleGrid[0].length - 1; j >= 0; j--) {
if (obstacleGrid[i][j] == 1) continue;
if (i == obstacleGrid.length - 1 && j == obstacleGrid[0].length - 1) {
dp[i][j] = 1;
} else if (i == obstacleGrid.length - 1) {
dp[i][j] = dp[i][j + 1];
} else if (j == obstacleGrid[0].length - 1) {
dp[i][j] = dp[i + 1][j];
} else {
dp[i][j] = dp[i][j + 1] + dp[i + 1][j];
}
}
}
return dp[0][0];
}
}
実行する場合:1ミリ秒、のJavaに提出するすべてのユーザーの83.38パーセントを打つ
メモリ消費量:37.7メガバイトは、Javaで提出するすべてのユーザーの67.00パーセントを破りました