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

留個疑問,這道題:

  • 直接忽略維度,仍然按照二分查找的標準套路一維來做
  • 先確定這個數在哪行,然後再確定在哪列

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章