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

Unique Paths II-leetcode

2015-11-22 16:45 453 查看
这道题是Uniue Paths的一个变种,却然我受益匪浅。

由于第一道题目我使用排列组合的算法做的,导致这道题目用同样的办法就会很麻烦。

使用第一问的结论来进行求解,将每个障碍划分为障碍之上和障碍之下的部分。但是多个障碍有一些会重复加减,就涉及到类似于概率论当中的加上每一个,减去两个交集,加上三个个的交集以此类推。虽然编码可以实现但真的是略显麻烦,而且容易出错。相信题目应该没有这么难,就看了其他人的讨论。果然是很简洁的做法。用到了叫什么“动态规划”的思想,让我这个算法渣渣再次感叹。就是每一个等于相邻的关系的之和,一次类推。边缘的特殊情况作为初始状态。

按照这种思路,两道题目都可以迎刃而解。


但是我之前的第一题的算法,从某种程度上(就是数值运算交给一个绝对高效的数学库)将时间复杂度为1。这是一种从排列组合,也就是其他抽象问题迁移过来的思路,将所要解决的问题抽象了。但是一旦问题有所变动,那么高度抽象的方法就需要很多很多的变动。甚至变得格外复杂。

从这种意义上将,貌似方法没有贵贱之分,只有具体问题的具体的最合适的情况。


而更加模拟原问题情景的算法在面对问题的变动的时候,可以按照原问题的思路来进行情况处理。

之前我还设想过一个算法,就是没经过一个分裂点就产生一个新的线程,每个线程到达终点以后为全局变量加一,这样似乎更加真是的模拟了对于不同路径的行走,但是起开销确实是过于庞大。


public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {

int m=obstacleGrid.length;
int n;
if(m==0){
return 0;
}else{
n=obstacleGrid[0].length;
}

int[][] dept=new int [m]
;
boolean rawflag=false;
boolean colflag=false;

for(int i=0;i<m;i++){//make the grid plugin to wall 1,because there is only one way to.
if(obstacleGrid[i][0]==1||rawflag==true){
rawflag=true;
dept[i][0]=0;
}else{
dept[i][0]=1;

}

}
for(int i=0;i<n;i++){
if(obstacleGrid[0][i]==1||colflag==true){
colflag=true;
dept[0][i]=0;

}else{
dept[0][i]=1;
}
}

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

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

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Uniue-Path