golang呼叫java的函式_大話golang效能分析(一):profile基本原理
阿新 • • 發佈:2021-01-30
技術標籤:LeetCode
63. 不同路徑 II
題目描述
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?
網格中的障礙物和空位置分別用 1
和 0
來表示。
示例1:
輸入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] 輸出:2 解釋: 3x3 網格的正中間有一個障礙物。 從左上角到右下角一共有 2 條不同的路徑: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右
示例2:
輸入:obstacleGrid = [[0,1],[0,0]]
輸出:1
提示:
-
m == obstacleGrid.length
-
n == obstacleGrid[i].length
-
1 ≤ m , n ≤ 100 1 \le m, n \le 100 1≤m,n≤100
-
obstacleGrid[i][j]
為0
或1
題解:
跟 不同路徑 基本是一樣的,f[i][j]
表示從 (0,0)
到 (i,j)
不同路徑數目,因為此題增加了障礙物條件,所以轉移方程需要改變一下。
初始時值都為零,表示所有都不可達,若 (0,0)
或 (n-1, m-1)
其中一個為 1
,就不可能到達右下角,直接返回 0
f[0][0]
置為 1
,表示有一條路徑可達。假設當前來到 (i,j)
位置,分情況討論:
-
若
(i, j)
位置為1
,直接跳過,障礙物肯定沒法到達的 -
否則的話,
f[i][j] = f[i - 1][j] + f[i][j - 1]
時間複雜度:
O
(
n
∗
m
)
O(n * m)
O(n∗m)
額外空間複雜度:
O
(
n
∗
m
)
O(n * m)
O(n∗m)
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int n = obstacleGrid.size();
int m = obstacleGrid[0].size();
if( obstacleGrid[0][0] || obstacleGrid[n - 1][m - 1] ) return 0;
vector<vector<int>> f( n, vector<int>(m, 0) );
f[0][0] = 1;
for ( int i = 1; i < m; ++i ) {
if ( obstacleGrid[0][i] ) break;
f[0][i] = 1;
}
for ( int i = 1; i < n; ++i ) {
if ( obstacleGrid[i][0] ) break;
f[i][0] = 1;
}
for ( int i = 1; i < n; ++i ) {
for ( int j = 1; j < m; ++j ) {
if ( obstacleGrid[i][j] ) continue;
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
return f[n - 1][m - 1];
}
};
/*
時間:0ms,擊敗:100.00%
記憶體:7.7MB,擊敗:88.50%
*/
使用滾動陣列優化第一維,需要特殊處理每行第一個元素:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int n = obstacleGrid.size();
int m = obstacleGrid[0].size();
if( obstacleGrid[0][0] || obstacleGrid[n - 1][m - 1] ) return 0;
vector<int> f(m);
f[0] = 1;
for ( int i = 0; i < n; ++i ) {
if ( obstacleGrid[i][0] ) f[0] = 0;
for ( int j = 0; j < m; ++j ) {
if ( obstacleGrid[i][j] ) {
f[j] = 0;
continue;
}
if ( j ) f[j] += f[j - 1];
}
}
return f[m - 1];
}
};
/*
時間:0ms,擊敗:100.00%s
記憶體:7.5MB,擊敗:93.33%
*/