Leetcode题解 0020期

喜欢数不能+1吗……阅读量倒是也不高,不过为什么我要追求这个呢……因为社会的浮躁性(别把所有事情都推给这个原因好吗)

0071题 简化路径【Simplify Path】

题目:
给定一个文档 (Unix-style) 的完全路径,请进行路径简化。
例如,

  • path = “/home/”, => “/home”
  • path = “/a/./b/../../c/”, => “/c”

边界情况:

你是否考虑了 路径 = “/../” 的情况?
在这种情况下,你需返回 “/” 。
此外,路径中也可能包含多个斜杠 ‘/’ ,如 “/home//foo/” 。
在这种情况下,你可忽略多余的斜杠,返回 “/home/foo” 。

示例见上

题目相对严谨

需要注意:
1. 还是一道字符串题目,编码问题等
2. Robust必须

解题思路:
一开始看到路径二字还以为是什么图论之类的,再不济也以为是链表,没想到是这种难以理解的题目……emm,尝试着编一下好了╮(╯▽╰)╭,标签里面提示是栈……稍微明白了一点。就是..弹出,然后其他情况下压栈,最后就是输出的处理,相对来说很简单。

class Solution:
    def simplifyPath(self, path):
        res = []
        for part in path.split('/'):
            if part in {'.', ''}:
                continue
            if part == '..':
                if res:
                    res.pop()
            else:
                res.append(part)

        return '/'+ '/'.join(res)

0072题 编辑距离【Edit Distance】

题目:
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符

示例:

输入: word1 = "horse", word2 = "ros"
输出: 3
解释: 
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

输入: word1 = "intention", word2 = "execution"
输出: 5
解释: 
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

经典题目相对严谨

经典题目无需注意太多

解题思路:
这道题是当年非常一道经典的难动态规划,当时就是想着这种题竟然是个DP题,真是开眼界了。没想到那么多年过去了,还能遇见你。
这里写图片描述

class Solution:
    def minDistance(self, word1, word2):
        n1 = len(word1)
        n2 = len(word2)
        if n1 < n2:
            n1, n2 = n2, n1
            word1, word2 = word2, word1

        dp = [[2 for col in range(n2 + 1)] for row in range(n1 + 1)]
        for i in range(n2+1):
            dp[0][i] = i

        f = 1
        nf = (not f) + 0
        for i in range(1,n1+1):
            for j in range(n2+1): dp[f][j] = 0x7fffffff
            dp[f][0] = i
            for j in range(1, n2+1):
                if word1[i-1] == word2[j-1]:
                    dp[f][j] = dp[nf][j-1]
                else:
                    dp[f][j] = min(dp[nf][j], dp[f][j-1]) + 1
                    dp[f][j] = min(dp[f][j], dp[nf][j-1] + 1)

            f = (not f) + 0
            nf = (not f) + 0

        return dp[nf][n2]

0073题 矩阵置零【Set Matrix Zeroes】

题目:
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
进阶:

  • 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。

你能想出一个常数空间的解决方案吗?

示例:

输入: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]

输入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

题目相对严谨

除Robust以外无需注意太多

解题思路:
有的时候一直觉得自己编写的python不是python而是套着python外皮的C++,之前也有过相关的吐槽吧……这题,时间换空间,flag数组直接和原数组统一即可。

class Solution:
    def setZeroes(self, matrix):
        n = len(matrix)
        if n == 0: return
        m = len(matrix[0])
        if m == 0: return
        for i in range(n):
            for j in range(m):
                if matrix[i][j] == 0:
                    for k in range(n):
                        if matrix[k][j] != 0: matrix[k][j] = '0'
                    for k in range(m):
                        if matrix[i][k] != 0: matrix[i][k] = '0'

        for i in range(n):
            for j in range(m):
                if matrix[i][j] == '0':
                    matrix[i][j] = 0

0074题 搜索二维矩阵【Search a 2D Matrix】

题目:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

示例:

输入:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 3
输出: true

输入:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 13
输出: false

题目相对严谨

除robust外无需注意太多

解题思路:
简单来说就是把一维的二分,变成二维,真棒啊,这个idea。不过相对来说简单,直接AC掉好了。
发现没有人用我这个方法?估计是data不够,没有区分度。

class Solution:
    def searchMatrix(self, matrix, target):
        n = len(matrix)
        if n == 0: return False
        m = len(matrix[0])
        if m == 0: return False
        left = 0
        right = n*m - 1
        while left <= right:
            mid = (left + right) // 2
            if target < matrix[mid//m][mid%m]:
                right = mid - 1
            elif target == matrix[mid//m][mid%m]:
                return True
            else:
                left = mid + 1

        return False

留个疑问,这道题:

  • 直接忽略维度,仍然按照二分查找的标准套路一维来做
  • 先确定这个数在哪行,然后再确定在哪列

哪个更快?╮(╯▽╰)╭

猜你喜欢

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