力扣第 464 场周赛

本文最后更新于 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 n

3659. 数组元素分组 - 力扣(LeetCode)

题目类型

#计数 #结论

解题思路

参考:结论题(Python/Java/C++/Go)

示例代码

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 <= n

3660. 跳跃游戏 9 - 力扣(LeetCode)

题目类型

#结论 #前后缀 #并查集 #线段树

解题思路

参考:结论题(Python/Java/C++/Go)

示例代码

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 ans

3661. 可以被机器人摧毁的最大墙壁数目 - 力扣(LeetCode)

题目类型

#状态机DP

解题思路

对机器人和障碍进行排序,当前机器人的破障数由前一个机器人的破障数转移,按破障方向划分状态,状态方程如下:

f[i + 1][j] = max(f[i][0] + cur - lidx, f[i][1] + ridx - cur)

参考:教你一步步思考 DP:从记忆化搜索到递推到空间优化(Python/Java/C++/Go)

示例代码

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]
力扣第 465 场周赛
力扣第 163 场双周赛