力扣第 461 场周赛

本文最后更新于 3 分钟前,文中所描述的信息可能已发生改变。

3637. 三段式数组 I - 力扣(LeetCode)

解题思路

一次遍历,注意判断相邻值相同的情况

示例代码

python
class Solution:
    def isTrionic(self, nums: List[int]) -> bool:
        d = []
        for x, y in pairwise(nums):
            if x == y:
                return False
            t = 1 if x < y else -1
            if d and t * d[-1] > 0:
                d[-1] += t
            else:
                d.append(t)
        return d[0] > 0 and len(d) == 3

3638. 平衡装运的最大数量 - 力扣(LeetCode)

解题思路

贪心,每次取相邻两个元素判断,满足数量加 1,下标加 1

示例代码

python
class Solution:
    def maxBalancedShipments(self, weight: List[int]) -> int:
        n = len(weight)
        ans = i = 0
        while i < n:
            if i + 1 < n and weight[i + 1] < weight[i]:
                i += 1
                ans += 1
            i += 1
        return ans

3639. 变为活跃状态的最小时间 - 力扣(LeetCode)

解题思路

二分,判别函数用贡献法计算即可

示例代码

python
class Solution:
    def minTime(self, s: str, order: List[int], k: int) -> int:
        n = len(s)
        order = [-1] + order

        def check(m):
            t = sorted(order[: m + 2])
            return sum((y - x) * (n - y) for x, y in pairwise(t)) >= k

        l = 0
        r = n - 1
        while l <= r:
            m = l + r >> 1
            if check(m):
                r = m - 1
            else:
                l = m + 1
        return l if check(l) else -1

3640. 三段式数组 II - 力扣(LeetCode)

解题思路

类似分组循环,不过多遍历了一次,另外首段递增用二分查找分界点,末段直接判断是否为正值,否则只累加nums[q + 1]

示例代码

python
class Solution:
    def maxSumTrionic(self, nums: List[int]) -> int:
        d = []
        for x, y in pairwise(nums):
            if x == y:
                d.append(0)
            else:
                t = 1 if x < y else -1
                if d and t * d[-1] > 0:
                    d[-1] += t
                else:
                    d.append(t)

        j = 0
        ans = -inf
        pre = list(accumulate(nums, initial=0))
        for i in range(len(d) - 2):
            if d[i] > 0 and d[i + 2] > 0 and d[i + 1] < 0:
                l = j
                p = l + d[i]
                q = p + abs(d[i + 1])
                r = q + d[i + 2]
                lidx = bisect_left(nums, 0, l, p - 1)
                tmp = pre[p + 1] - pre[lidx] + \
                        pre[q + 1] - pre[p + 1] + \
                        max(pre[r + 1] - pre[q + 1], nums[q + 1])
                ans = max(ans, tmp)
            j += abs(d[i]) if d[i] else 1
        return ans
力扣第 460 场周赛
Material Project Flatband Machine Learning