Leetcode周赛 | 2023-8-5

题1

在这里插入图片描述

体会

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

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

还是编程能力不足。

在这里插入图片描述
(上面说复制数组,其实只要头元素复制到最后,尾元素复制到最前,也行)

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

在这里插入图片描述
在这里插入图片描述

体会

这道题当时大概看了一眼,觉得没思路就放弃了。
在这里插入图片描述
在这里插入图片描述
同样,最后对操作次数进行枚举,找出第一次满足条件的次数,返回答案即可。

我的代码

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值