Unique Paths

题目详情:https://leetcode.com/problems/unique-paths-ii/description/

自己写的代码,感觉不够简洁

# -*- coding:utf-8 -*-
class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m=len(obstacleGrid)
        n=0
        if m==0:
            return 0
        else:#m!=0,即行数不为0
            n=len(obstacleGrid[0])
        #该条语句中1-l主要是为了把障碍物变成0,把非障碍物0变成1。第一行和第一列要单独处理
        ans=[ [1-l for l in r] for r in obstacleGrid]
        r=0
        obstacle=1-obstacleGrid[0][0]
        while r<m:#一行一行的处理每行的行首元素,即处理第一列中元素
            if obstacleGrid[r][0]==1:#如果遇到1,即障碍物,则到达该行下边的行首元素的路径条数为0,即都不可到达
                obstacle=0
            ans[r][0]=obstacle
            r+=1
        l=1
        obstacle=1-obstacleGrid[0][0]
        while l<n:#处理第一行中的元素
            if obstacleGrid[0][l]==1:#如果在第一行中有1,即有障碍物,那么到达该元素以右的路径条数为0条
                obstacle=0
            ans[0][l]=obstacle
            l=l+1
        row,column=1,1
        # print ans
        while row<m:
            column=1#每一行从第二元素开始进行
            while column<n:
                if ans[row][column]!=0:#不处理0元素,使其保持为0。只处理非0元素。因为这里的0为有障碍物,无法到达
                    ans[row][column]=ans[row-1][column]+ans[row][column-1]
                column+=1
            row+=1
        return ans[m-1][n-1]

然后看到大神写的代码,还有这种操作啊,特此纪念

# -*- coding:utf-8 -*-
class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m=len(obstacleGrid)
        n=len(obstacleGrid[0])
        #下列情况中都是路径条数为0的
        if m==0 or n==0 or obstacleGrid[0][0]==1 or obstacleGrid[m-1][n-1]==1:
            return 0
        rows=[0]*n#用O(n)的存储空间,实现存储O(n*n)个数的功能,长见识了
        rows[0]=1#因为第一个元素肯定不是0
        for row in range(m):
            for column in range(n):
                # print row,column
                if obstacleGrid[row][column]==1:
                    rows[column]=0
                elif column>0:
                    rows[column]+=rows[column-1]#这步就是实现存储空间充分利用的保证
        return rows[-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值