Unique Paths II-leetcode

这道题是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];


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马工匠坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值