您的位置:首页 > 产品设计 > UI/UE

Unique Paths I & II

2014-03-16 14:57 295 查看
因为两个problem都是关于Unique Paths,所以这一周都做了来个两连发:)

(1) Unique Paths I 

class Solution {
public:
int uniquePaths(int m, int n) {

if(m==1||n==1)
return 1;

int a[m]
;

for(int i=0;i<m;i++)
a[i][n-1]=1;

for(int i=0;i<n;i++)
a[m-1][i]=1;

for(int i=n-2; i>=0; i--)
for(int j=m-2;j>=0;j--)
a[j][i]=a[j+1][i]+a[j][i+1];

return a[0][0];

}
};


一开始下意识就想到用递归,然后唰唰唰三行代码就写完了,想不到在线judge的时候报time exceed的错误,应该是当输入规模达到一定程度是递归栈上的开销太大了。然后百度搜到了其他人的数组实现[1],一下子有头绪了然后再唰唰唰写出了accepted的版本了。原理非常简单,就是用二维数组对应题目的mXn grid,然后每一个元素记录当前位置到终点的可达路线数。时间规模是O(mn)。

(2) Unique Paths II

class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {

int m=obstacleGrid.size(),n=obstacleGrid.at(0).size();
int i,j;

if(m==1||n==1)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(obstacleGrid[i][j]==1)
return 0;
return 1;
}

if(obstacleGrid[m-1][n-1]==1)
return 0;

for (i=m-1;i>=0;i--)
if(obstacleGrid[i][n-1]==0)
obstacleGrid[i][n-1]=1;
else
{
obstacleGrid[i][n-1]=0;
break;
}
for(;i>=0;i--)
obstacleGrid[i][n-1]=0;

for(j=n-2;j>=0;j--)
if(obstacleGrid[m-1][j]==0)
obstacleGrid[m-1][j]=1;
else
{
obstacleGrid[m-1][j]=0;
break;
}
for(;j>=0;j--)
obstacleGrid[m-1][j]=0;

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

return obstacleGrid[0][0];

}
};


这个是上一个的进阶版吧,额外添加了障碍obstacle,并且程序的接口要求对二维的vector进行处理。解题思路也很简单,只是比上一个多考虑点东西就行了。先对末行和末列进行初始化,然后在obstacle点赋值为0(此点不能走所以此点都终点的可达线路数为0),剩下的就是可和(1)同样的处理了。另外注意的是二维vector的操作(vector[][], at())和对特殊情况的处理(有一维长度是1和终点是obstacle)。

参考:

[1] http://blog.csdn.net/jellyyin/article/details/8682765
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: