本文最后更新于 3 分钟前,文中所描述的信息可能已发生改变。
3658. 奇数和与偶数和的最大公约数 - 力扣(LeetCode)
题目类型
#数学
解题思路
累加求和,奇数求和为n*n,偶数求和为n*(n+1),即gcd(n*n, n*(n+1)) = n
示例代码
python
class Solution:
def gcdOfOddEvenSums(self, n: int) -> int:
return n3659. 数组元素分组 - 力扣(LeetCode)
题目类型
#计数 #结论
解题思路
示例代码
python
class Solution:
def partitionArray(self, nums: List[int], k: int) -> bool:
n = len(nums)
return n % k == 0 and max(Counter(nums).values()) * k <= n3660. 跳跃游戏 9 - 力扣(LeetCode)
题目类型
#结论 #前后缀 #并查集 #线段树
解题思路
示例代码
python
class Solution:
def maxValue(self, nums: List[int]) -> List[int]:
n = len(nums)
pre_max = [0] * (n + 1)
for i, x in enumerate(nums):
pre_max[i + 1] = max(pre_max[i], x)
mn = inf
ans = [0] * n
cur = pre_max[-1]
for i in range(n - 1, -1, -1):
if pre_max[i + 1] <= mn:
cur = pre_max[i + 1]
mn = min(mn, nums[i])
ans[i] = cur
return ans3661. 可以被机器人摧毁的最大墙壁数目 - 力扣(LeetCode)
题目类型
#状态机DP
解题思路
对机器人和障碍进行排序,当前机器人的破障数由前一个机器人的破障数转移,按破障方向划分状态,状态方程如下:
f[i + 1][j] = max(f[i][0] + cur - lidx, f[i][1] + ridx - cur)
示例代码
python
fmin = lambda a, b: b if b < a else a
fmax = lambda a, b: b if b > a else a
class Solution:
def maxWalls(self, robots: List[int], distance: List[int], walls: List[int]) -> int:
n = len(robots)
a = sorted(zip(robots, distance), key=lambda p: p[0])
walls.sort()
f = [0, 0]
for i, (x, d) in enumerate(a):
lx = fmax(x - d, a[i - 1][0] + 1) if i else x - d
lidx = bisect_left(walls, lx)
cur = bisect_right(walls, x)
res = f[0] + cur - lidx
cur = bisect_left(walls, x)
for j in range(2):
rx = x + d
if i + 1 < n:
x2 = a[i + 1][0]
if j == 0:
x2 -= a[i + 1][1]
rx = fmin(rx, x2 - 1)
ridx = bisect_right(walls, rx)
f[j] = fmax(res, f[1] + ridx - cur)
return f[1]