Leetcode周赛 | 2023-8-5

2023-8-5

  • 题1
    • 体会
    • 我的代码
  • 题2
    • 体会
    • 我的代码

题1

Leetcode周赛 | 2023-8-5_第1张图片

体会

一开始是觉得这道题是贪心的,选出现次数最多的元素,但是发现,当有多个元素出现次数均为最多时,似乎很难处理,就放弃了。转而问ChatGPT ,结果让自己走上了考虑动态规划的不归路。

就是贪心,就是贪心,就是贪心。

还是编程能力不足。

Leetcode周赛 | 2023-8-5_第2张图片
(上面说复制数组,其实只要头元素复制到最后,尾元素复制到最前,也行)

class Solution:
    def minimumSeconds(self, nums: List[int]) -> int:
        pos = defaultdict(list)
        n = len(nums)
        for i in range(2 * n):
            pos[nums[i % n]].append(i)
        
        ans = inf
        for x in pos.values():
            v = 0
            for i in range(len(x)-1):
                v = max(v, (x[i+1] - x[i]) // 2)
            ans = min(ans, v)
        return ans

我的代码

题2

Leetcode周赛 | 2023-8-5_第3张图片
Leetcode周赛 | 2023-8-5_第4张图片

体会

这道题当时大概看了一眼,觉得没思路就放弃了。
Leetcode周赛 | 2023-8-5_第5张图片
Leetcode周赛 | 2023-8-5_第6张图片
同样,最后对操作次数进行枚举,找出第一次满足条件的次数,返回答案即可。

我的代码

class Solution:
    def minimumTime(self, nums1: List[int], nums2: List[int], x: int) -> int:
        v1 = sum(nums1)
        v2 = sum(nums2)
        
        n = len(nums1)
        sorted_range = sorted(range(n), key=lambda x: nums2[x])
        dp = [-inf] * (n + 1)
        dp[0] = 0
        for i in sorted_range:
            for j in range(n, 0, -1):
                dp[j] = max(dp[j], dp[j-1] + nums1[i] + nums2[i] * j)
        
        for i in range(n + 1):
            if v1 + v2 * i - dp[i] <= x:
                return i
        return -1

你可能感兴趣的:(算法)