Leetcode题解 0018期

端午节快乐???即使是端午节,放假和不放假有什么区别……

0063题 不同路径 II【Unique Paths II】

题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
这里写图片描述
网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:m 和 n 的值均不超过 100。
示例:

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

题目相对严谨

除Robust以外无需注意太多

解题思路:
这道题其实不像上一道题那样可以直接用数学方法解决,那么还不如老老实实用动态规划处理一下,这里post代码

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid):
        n = len(obstacleGrid)
        if n == 0: return 0
        m = len(obstacleGrid[0])
        d = [[0 for col in range(m)] for row in range(n)]
        for i in range(n):
            if obstacleGrid[i][0] != 1:
                d[i][0] = 1
            else:
                break
        for i in range(m):
            if obstacleGrid[0][i] != 1:
                d[0][i] = 1
            else:
                break
        for i in range(1,n):
            for j in range(1,m):
                if obstacleGrid[i][j] != 1:
                    d[i][j] = d[i-1][j] + d[i][j-1]

        return d[n-1][m-1]

0064题 最小路径和【Minimum Path Sum】

题目:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

题目相对严谨

除Robust以外无需注意太多:
额外注意的就是一定要知道谁是行数谁是列数,如何循环,很多人的解法n和m不是按照字典顺序来赋值的,比如说我自己就是……反正这点要多加小心。

解题思路:
第一反应宝藏迷宫……第二反应并不是01背包问题……而又是那个和前面两题一样的简单DP,这里就不post代码了……这几题为什么难度标的中等啊……

其实突然相到这种题可以直接在原数组上修改的,这样额外空间使用就是 O ( 1 ) 了。


0065题 有效数字【Valid Number】

题目:
验证给定的字符串是否为数字。

说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。

更新于 2015-02-10:
C++函数的形式已经更新了。如果你仍然看见你的函数接收 const char * 类型的参数,请点击重载按钮重置你的代码。

示例:

例如:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

题目非常不严谨

根本不知道该怎么写这个需要注意,只能一点一点来?喵的,降低提交通过率的一道题,反正我的提交通过率也不是很高→_→

这题标准解题方法也是各种情况都要考虑吧,不过你们不可能有我考虑的多啊,比如说像是一串计算式,带有逗号的数字表达法,换进制带有ABCDEF的数字等……这些都没有出现,所以一套try except带走了喂。

class Solution:
    def isNumber(self, s):
        try:
            float(s)
            return True
        except:
            return False

哼,本来还以为有什么难度……没想到是一个小垃圾。


0066题 加一【Plus One】

题目:
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

示例:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

题目相对严谨

无需注意太多

解题思路:
额,就是高精度加1吧,那就很简单了,post代码

class Solution:
    def plusOne(self, digits):
        n = len(digits)
        digits[-1] += 1
        for i in range(n-1,0,-1):
            if digits[i] == 10:
                digits[i] = 0
                digits[i-1] += 1
        if digits[0] == 10:
            digits[0] = 0
            digits.insert(0,1)
        return digits

然而,在看到python的最快解法的时候,我傻眼了,原来还可以直接算啊……哭笑不得

class Solution:
    def plusOne(self, digits):
        sum=0
        for i in digits:
            sum=10*sum+i
        return [int(x) for x in str(sum+1)]

小聪明划出天际了(

猜你喜欢

转载自blog.csdn.net/bright_silmarillion/article/details/80723163