前言
继续leetcode刷题生涯
这里记录的都是笔者觉得有点意思的做法
参考了好几位大佬的题解,感谢各位大佬
1143. 最长公共子序列
class Solution:
def longestCommonSubsequence(self, A: str, B: str) -> int:
m, n = len(A), len(B)
res = 0
dp = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if A[i - 1] == B[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return dp[-1][-1]
1144. 递减元素使数组呈锯齿状
class Solution:
def movesToMakeZigzag(self, nums: List[int]) -> int:
n = len(nums)
res1, res2 = 0, 0
for i in range(n):
# 奇数位置
if i % 2 == 0:
d1 = nums[i] - nums[i - 1] + 1 if i > 0 and nums[i] >= nums[i - 1] else 0
d2 = nums[i] - nums[i + 1] + 1 if i < n - 1 and nums[i] >= nums[i + 1] else 0
res1 += max(d1, d2)
# 偶数位置
else:
d1 = nums[i] - nums[i - 1] + 1 if nums[i] >= nums[i - 1] else 0
d2 = nums[i] - nums[i + 1] + 1 if i < n - 1 and nums[i] >= nums[i + 1] else 0
res2 += max(d1, d2)
return min(res1, res2)
1145. 二叉树着色游戏
class Solution:
def btreeGameWinningMove(self, root: TreeNode, n: int, x: int) -> bool:
self.left, self.right = 0, 0
def dfs(root):
if not root:
return 0
left = dfs(root.left)
right = dfs(root.right)
if root.val == x:
self.red_left = left
self.red_right = right
return left + right + 1
dfs(root)
parent = n - self.red_left - self.red_right - 1
judge = [parent, self.red_left, self.red_right]
return any([j > n // 2 for j in judge])
1146. 快照数组
class SnapshotArray:
def __init__(self, length: int):
# 初始化字典数组和 id
self.arr = [{
0: 0} for _ in range(length)]
self.sid = 0
def set(self, index: int, val: int) -> None:
# 设置当前快照的元素值
self.arr[index][self.sid] = val
def snap(self) -> int:
# 每次快照 id 加 1
self.sid += 1
# 返回上一个快照 id
return self.sid - 1
def get(self, index: int, snap_id: int) -> int:
# 选择要查找的元素的字典
d = self.arr[index]
# 如果快照恰好存在, 直接返回
if snap_id in d:
return d[snap_id]
# 不存在则进行二分搜索, 查找快照前最后一次修改
k = list(d.keys())
i = bisect.bisect_left(k, snap_id)
return d[k[i - 1]]
1147. 段式回文
class Solution:
def longestDecomposition(self, text: str) -> int:
n = len(text)
i, j = 0, n - 1
str1, str2, res = '', '', 0
while i < j:
str1 = str1 + text[i]
str2 = text[j] + str2
if str1 == str2:
res += 2
str1, str2 = '', ''
i += 1
j -= 1
if n % 2 == 1 or str1 != '':
res += 1
return res