Unique Paths II-leetcode

来源:互联网 发布:c语言宿舍管理系统 编辑:程序博客网 时间:2024/06/14 07:35

这道题是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][n];            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];    }}
0 0