码迷,mamicode.com
首页 > 其他好文 > 详细

笔试题76. LeetCode OJ (63)

时间:2016-06-12 02:31:29      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

    Unique Paths II

    这次还是机器人在最左上角,想要到达最右下角,机器人能走的方向还是向下和向右,但是与上次不同的是:路上有障碍物,有障碍物的地方不能通过,找出所有独一无二的路径。

    上个题的解题思路我自己好像也没什么算法根据,凭借的是自己观察问题找到的,不过这个题我还是按照那样的想法去做的话,确实没想通,我试了一下,发现代码很复杂而且没有把握,所以我换了种思路,我借鉴了一下网友的,主要是为了弄明白这个题属于哪一类问题,它是动态规划类的问题!

    首先,我们可以得出这样一个结论:机器人当前所在的位置(i,j)其实是由(i,j-1)或者(i-1,j)位置得到的,所以我们可以得出:

                         nums(i , j) = nums(i , j-1) + nums(i-1 , j)

    这点推导出来了,解题就简单多了,所以我们就可以很方便的解题了,不过需要注意的一点就是,当 (i , j) 位置为障碍物时,它的路径数目为0。

技术分享

下面就给出代码吧,想清楚思路后真的是很容易就可以解决问题。

class Solution {
public:
	int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
	{
		if (obstacleGrid.size() == 0 || obstacleGrid[0].size() == 0)
		{
			return 0;
		}
		//采用动态规划解题
		int xLen = obstacleGrid.size();
		int yLen = obstacleGrid[0].size();
		
		//开辟额外的空间,因为每个位置都是由它上方或者左方过来的,所以(i,j)位置的路径=nums(i,j-1)+nums(i-1,j)
		//多开辟出来的空间其实是辅助作用
		vector<vector<int>> V(xLen + 1, vector<int>(yLen + 1, 0));
	
		
		V[0][1] = 1;  // 其实将v[1][0]置为1效果一样,因为他们都是辅助空间
		for (int i = 1; i <= xLen; ++i)
		{
			for (int j = 1; j <= yLen; ++j)
			{
				if (obstacleGrid[i-1][j-1] == 0)
					V[i][j] = V[i][j - 1] + V[i - 1][j]; //nums(i,j) = nums(i,j-1) + nums(i-1,j)
				else
					V[i][j] = 0; 	//但是考虑到存在障碍物,障碍物对应位置的路径数目为 0 
			}
		}
		return V[xLen][yLen];
	}
};
程序的结果如下:

技术分享

笔试题76. LeetCode OJ (63)

标签:

原文地址:http://blog.csdn.net/zr1076311296/article/details/51622275

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!