喜欢数不能+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
留个疑问,这道题:
- 直接忽略维度,仍然按照二分查找的标准套路一维来做
- 先确定这个数在哪行,然后再确定在哪列
哪个更快?╮(╯▽╰)╭