345 出现次数最多字符的质数判定
思路:
- is_prime 函数: 这个辅助函数用于检查给定数字是否是质数。我们从
2开始检查,直到n的平方根。如果我们找到一个能整除n的数,则n不是质数。 - Counter: 我们使用
collections.Counter来统计字符串中每个字符的频率。 - max 函数: 找出频率字典中最大的值,这就是字符串中出现次数最多的字符的次数。
- 判断质数: 通过调用
is_prime函数来判断这个最大频率是否为质数,并根据结果返回 "YES" 或 "NO"。
from collections import Counter
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def solution(s: str) -> str:
f = Counter(s)
cnt = max(f.values())
if is_prime(cnt):
return "YES"
else:
return "NO"
106小M的多任务下载器挑战
时间复杂度:O(N log N)
def solution(n, array):
# 创建一个事件列表
events = []
# 将每个任务的开始和结束时间添加到事件列表中
for task in array:
start = task[0]
duration = task[1]
end = start + duration
# 添加开始事件和结束事件
events.append((start, 1)) # 任务开始
events.append((end, -1)) # 任务结束
# 对事件进行排序
events.sort()
max_concurrent_tasks = 0
current_tasks = 0
# 遍历所有事件
for time, event in events:
current_tasks += event # 更新当前任务数
max_concurrent_tasks = max(max_concurrent_tasks, current_tasks) # 更新最大并发数
return max_concurrent_tasks
108 小M的弹子游戏机挑战
思路:1. 定义状态:
- 创建一个 DP 表 `dp[i][j]`,表示从上到达位置 `(i, j)` 时的最大分数。
-
状态转移:
-
从最后一行开始,向上逐行处理:
-
如果当前格是得分点,则
dp[i][j]=得分点的值 + dp[i+1][j](即来自下一行正下方的分数)。 -
如果当前格是钉子,则可以选择从左下或者右下弹射过来,因此:
- 如果
(i+1, j-1)和(i+1, j+1)是合法位置,我们需要考虑这些位置的最大分数。
- 如果
-
-
-
初始化:
- 最后一行的 DP 值直接反映其在原数组中的值。
-
结果:
- 最终结果为 DP 表第一行的最大值,即弹珠从最上方任何位置掉落时的最高分数。
def solution(n, m, array):
# DP 表初始化为 0
dp = [[0] * m for _ in range(n)]
# 初始化 DP 表的最后一行
for j in range(m):
if array[n - 1][j] >= 0: # 只考虑得分点
dp[n - 1][j] = array[n - 1][j]
# 从倒数第二行向上遍历,每次更新 DP 表
for i in range(n - 2, -1, -1):
for j in range(m):
if array[i][j] == -1:
# 钉子情况,可以斜向下落
if j > 0: # 左下
dp[i][j] = max(dp[i][j], dp[i + 1][j - 1]) # 左下的分数
if j < m - 1: # 右下
dp[i][j] = max(dp[i][j], dp[i + 1][j + 1]) # 右下的分数
elif array[i][j] >= 0:
# 得分点情况,累加对应得分
dp[i][j] = array[i][j] + dp[i + 1][j]
# 找到第一行中的最大分数
max_score = 0
for j in range(m):
max_score = max(max_score, dp[0][j])
return max_score