LeetCode 63 — Unique Paths II(C++ Java Python)

题目:http://oj.leetcode.com/problems/unique-paths-ii/

Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

For example,

There is one obstacle in the middle of a 3x3 grid as illustrated below.

[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]

The total number of unique paths is 2.

Note: m and n will be at most 100.

题目翻译:

"Unique Paths"续:
现在考虑如果在网格中添加一些障碍,会有多少种不同的路径?
网格中分别用1和0标记障碍物和空的网格。
例如,
下图所示的3 x 3方格的中间有一个障碍。
不同的路径总数为2。
注意:m和n最大为​​100。

分析:

        有障碍的地方路径数为0。

C++实现:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
    	int m = obstacleGrid.size();
    	int n = obstacleGrid[0].size();

    	if(obstacleGrid[0][0] == 1)
    	{
    		return 0;
    	}
    	else if(m == 1 && n == 1)
    	{
    		return 1;
    	}

    	int paths[m][n];

    	for(int i = 0; i < m; ++i)
    	{
    		if(obstacleGrid[i][0] == 1)
    		{
    			while(i < m)
    			{
    				paths[i][0] = 0;
    				++i;
    			}
    			break;
    		}
    		else
    		{
    			paths[i][0] = 1;
    		}
    	}

    	for(int j = 1; j < n; ++j)
        {
        	if(obstacleGrid[0][j] == 1)
        	{
        		while(j < n)
        		{
        			paths[0][j] = 0;
        			++j;
        		}
        		break;
        	}
        	else
        	{
        		paths[0][j] = 1;
        	}
        }

    	for(int i = 1; i < m; ++i)
    		for(int j = 1; j < n; ++j)
    		{
    			if(obstacleGrid[i][j] == 1)
    			{
    				paths[i][j] = 0;
    			}
    			else
    			{
    				paths[i][j] = paths[i][j - 1] + paths[i - 1][j];
    			}
    		}

    	return paths[m - 1][n - 1];
    }
};

Java实现:

public class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
		int m = obstacleGrid.length;
		// if (m == 0) {
		// 	   return 0;
		// }

		int n = obstacleGrid[0].length;

		if (obstacleGrid[0][0] == 1) {
			return 0;
		} else if (m == 1 && n == 1) {
			return 1;
		}

		int[][] paths = new int[m][n];

		for (int i = 0; i < m; ++i) {
			if (obstacleGrid[i][0] == 1) {
				while (i < m) {
					paths[i][0] = 0;
					++i;
				}
				break;
			} else {
				paths[i][0] = 1;
			}
		}

		for (int j = 1; j < n; ++j) {
			if (obstacleGrid[0][j] == 1) {
				while (j < n) {
					paths[0][j] = 0;
					++j;
				}
				break;
			} else {
				paths[0][j] = 1;
			}
		}

		for (int i = 1; i < m; ++i)
			for (int j = 1; j < n; ++j) {
				if (obstacleGrid[i][j] == 1) {
					paths[i][j] = 0;
				} else {
					paths[i][j] = paths[i][j - 1] + paths[i - 1][j];
				}
			}

		return paths[m - 1][n - 1];
    }
}

Python实现:

class Solution:
    # @param obstacleGrid, a list of lists of integers
    # @return an integer
    def uniquePathsWithObstacles(self, obstacleGrid):
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        
        if obstacleGrid[0][0] == 1:
            return 0
        elif m == 1 and n == 1:
            return 1
        
        paths = [[] for i in range(m)] 
        
        for i in range(m):
            if obstacleGrid[i][0] == 1:
                while(i < m):
                    paths[i].append(0)
                    i += 1
                break;
            else:
                paths[i].append(1)
        
        for j in range(1, n):
            if obstacleGrid[0][j] == 1:
                while(j < n):
                    paths[0].append(0)
                    j += 1
                break;
            else:
                paths[0].append(1)
                
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 1:
                    paths[i].append(0)
                else:
                    paths[i].append(paths[i][j - 1] + paths[i - 1][j])
                    
        return paths[m - 1][n - 1]

        感谢阅读,欢迎评论!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值