目录
1、统计参与通信的服务器
class Solution:
def countServers(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0]) #统计grid二维数组
rows = [0] * m #定义行列数组统计每行的元素
cols = [0] * n
for i in range(m): #遍历整个二维数组,只要有服务器的都加1
for j in range(n):
if grid[i][j] == 1:
rows[i] += 1
cols[j] += 1
ans = 0
for i in range(m):
for j in range(n):
if grid[i][j] == 1 and (rows[i] > 1 or cols[j] > 1):
ans += 1
return ans
2、统计二叉树中好节点的数目
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def goodNodes(self, root: TreeNode) -> int:
def dfs(root: TreeNode, mx: int):
if root is None:
return
nonlocal ans #局部函数内变量修改全局变量使用nonlocal
if mx <= root.val: #发现这个节点是好节点
ans += 1
mx = root.val #修改值
dfs(root.left, mx)
dfs(root.right, mx)
ans = 0
dfs(root, -1000000) #将初始的mx设置为-1000000则保证了树的根节点一定是好节点
return ans
3、移动片段得到字符串
class Solution:
def canChange(self, start: str, target: str) -> bool:
n = len(start)
i = j = 0
while 1:
while i < n and start[i] == '_':
i += 1
while j < n and target[j] == '_':
j += 1
if i >= n and j >= n:
return True
if i >= n or j >= n or start[i] != target[j]:
return False
if start[i] == 'L' and i < j:
return False
if start[i] == 'R' and i > j:
return False
i, j = i + 1, j + 1
4、买卖股票的最佳时机含冷冻期
class Solution:
def maxProfit(self, prices: List[int]) -> int:
@cache
def dfs(i: int, j: int) -> int:
if i >= len(prices):
return 0
ans = dfs(i + 1, j)
if j:
ans = max(ans, prices[i] + dfs(i + 2, 0))
else:
ans = max(ans, -prices[i] + dfs(i + 1, 1))
return ans
return dfs(0, 0)
5、买卖股票的最佳时机③
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# 第一次买入,第一次卖出,第二次买入,第二次卖出
f1, f2, f3, f4 = -prices[0], 0, -prices[0], 0
for price in prices[1:]:
f1 = max(f1, -price)
f2 = max(f2, f1 + price)
f3 = max(f3, f2 - price)
f4 = max(f4, f3 + price)
return f4
6、全部开花的最早一天
class Solution:
def earliestFullBloom(self, plantTime: List[int], growTime: List[int]) -> int:
ans = days = 0
for p, g in sorted(zip(plantTime, growTime), key=lambda z: -z[1]):
days += p # 累加播种天数
ans = max(ans, days + g) # 再加上生长天数,就是这个种子的开花时间
return ans
7、打家劫舍
class Solution:
def rob(self, nums: List[int]) -> int:
n = len(nums)
f = [0] * (n + 1)
f[1] = nums[0]
for i in range(2, n + 1):
f[i] = max(f[i - 1], f[i - 2] + nums[i - 1])
return f[n]