LeetCode笔记:Weekly Contest 329

本文介绍了LeetCode周赛329的四道题目,包括交替位数和问题、按第k个分数排序学生、位操作使字符串相等以及数组分割最小成本。提供了Python解题代码和思路分析,涉及动态规划和数据结构的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这一题就是把数字按照位数进行拆分,然后首位赋值正号,后面依序定一下正负号,然后求和即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def alternateDigitSum(self, n: int) -> int:
        res, flag = 0, 1
        for digit in str(n):
            res += flag * int(digit)
            flag *= -1
        return res

提交代码评测得到:耗时47ms,占用内存13.9MB。

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题就是根据每一行的第k个元素对每一行的数组进行倒序排列,这个在要自己实现的话还得注意每一行元素变幻的完整性,但是对于像python这种高级语言,基本上就一行代码就是了,倒是没啥好多说的……

2. 代码实现

给出python代码实现如下:

class Solution:
    def sortTheStudents(self, score: List[List[int]], k: int) -> List[List[int]]:
        return sorted(score, key=lambda x: x[k], reverse=True)

提交代码评测得到:耗时443ms,占用内存20.4MB。

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题考察变换方式有:

  • 00 -> 00
  • 01 -> 11
  • 10 -> 11
  • 11 -> 10

可以看到:

  • 0转换为1和1转换为0都是可以实现的,但是前提是必须有另一个1存在。

只要target全为0,那么输入也必须全为0,如果target不全为0,那么只要输入字符串当中不全为0即可转换成功。

2. 代码实现

给出python代码实现如下:

class Solution:
    def makeStringsEqual(self, s: str, target: str) -> bool:
        cnt = Counter(s)
        tgt = Counter(target)
        if tgt['1'] == 0:
            return cnt['1'] == 0
        else:
            return cnt['1'] > 0

提交代码评测得到:耗时88ms,占用内存15.1MB。

4. 题目四

给出题目四的试题链接如下:

1. 解题思路

这一题我的思路就是一个动态规划来决定切分点。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minCost(self, nums: List[int], k: int) -> int:
        n = len(nums)
        
        @lru_cache(None)
        def dp(idx):
            if idx >= n:
                return 0
            i = idx
            cnt = defaultdict(int)
            while i < n and cnt[nums[i]] == 0:
                cnt[nums[i]] += 1
                i += 1
            res, s = k + dp(i), k
            for j in range(i, n):
                cnt[nums[j]] += 1
                if cnt[nums[j]] == 2:
                    s += 2
                elif cnt[nums[j]] > 2:
                    s += 1
                res = min(res, s + dp(j+1))
                if s >= res:
                    break
            return res

        return dp(0)            

提交代码评测得到:耗时5954ms,占用内存16.2MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值