1. 程式人生 > 其它 >golang呼叫java的函式_大話golang效能分析(一):profile基本原理

golang呼叫java的函式_大話golang效能分析(一):profile基本原理

技術標籤:LeetCode

63. 不同路徑 II

題目描述

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?
在這裡插入圖片描述

網格中的障礙物和空位置分別用 10 來表示。

示例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 1m,n100

  • obstacleGrid[i][j]01


題解:

不同路徑 基本是一樣的,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(nm)
額外空間複雜度: O ( n ∗ m ) O(n * m) O(nm)

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%
*/