LeetCode笔记:Weekly Contest 329

  • LeetCode笔记:Weekly Contest 329
    • 1. 题目一
      • 1. 解题思路
      • 2. 代码实现
    • 2. 题目二
      • 1. 解题思路
      • 2. 代码实现
    • 3. 题目三
      • 1. 解题思路
      • 2. 代码实现
    • 4. 题目四
      • 1. 解题思路
      • 2. 代码实现
  • 比赛链接:https://leetcode.com/contest/weekly-contest-329/

1. 题目一

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

  • 2544. Alternating Digit Sum

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. 题目二

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

  • 2545. Sort the Students by Their Kth Score

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. 题目三

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

  • 2546. Apply Bitwise Operations to Make Strings Equal

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. 题目四

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

  • 2547. Minimum Cost to Split an Array

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。

你可能感兴趣的:(leetcode笔记,周赛,329,leetcode,2544,leetcode,2545,leetcode,2546,leetcode,2547)