喜歡數不能+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 所使用的最少操作數 。
你可以對一個單詞進行如下三種操作:
- 插入一個字符
- 刪除一個字符
- 替換一個字符
示例:
輸入: 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
留個疑問,這道題:
- 直接忽略維度,仍然按照二分查找的標準套路一維來做
- 先確定這個數在哪行,然後再確定在哪列
哪個更快?╮(╯▽╰)╭