[LeetCode周赛复盘] 第 119 场双周赛20231209

[LeetCode周赛复盘] 第 119 场双周赛20231209

    • 一、本周周赛总结
    • 100130. 找到两个数组中的公共元素
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 100152. 消除相邻近似相等字符
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 100147. 最多 K 个重复元素的最长子数组
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 100140. 关闭分部的可行集合数目
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 参考链接

一、本周周赛总结

  • T1 模拟。
  • T2 贪心。
  • T3 滑窗。
  • T4 floyd+枚举。

100130. 找到两个数组中的公共元素

100130. 找到两个数组中的公共元素

1. 题目描述

[LeetCode周赛复盘] 第 119 场双周赛20231209_第1张图片

2. 思路分析

按题意模拟即可。

3. 代码实现

class Solution:
    def findIntersectionValues(self, nums1: List[int], nums2: List[int]) -> List[int]:
        s1 = set(nums1)
        s2 = set(nums2)
        return [sum(1 for num in nums1 if num in s2), sum(1 for num in nums2 if num in s1)]

100152. 消除相邻近似相等字符

100152. 消除相邻近似相等字符

1. 题目描述

[LeetCode周赛复盘] 第 119 场双周赛20231209_第2张图片

2. 思路分析

贴模板。

  • 都乘到一起找质因数就是分别找质因数然后去重,因此用set记录并集即可。

3. 代码实现

class Solution:
    def removeAlmostEqualCharacters(self, word: str) -> int:
        n = len(word)
        s = list(word)
        i = 1
        ans = 0
        while i < n:
            if abs(ord(s[i])-ord(s[i-1])) <= 1:
                ans += 1
                i += 1
            i += 1                
        
        return ans

100147. 最多 K 个重复元素的最长子数组

100147. 最多 K 个重复元素的最长子数组

1. 题目描述

[LeetCode周赛复盘] 第 119 场双周赛20231209_第3张图片

2. 思路分析

  • 很板的滑窗。用一个哈希表统计次数即可。

3. 代码实现

class Solution:
    def maxSubarrayLength(self, nums: List[int], k: int) -> int:
        l = 0
        cnt = Counter()
        ans = 0
        for i, v in enumerate(nums):
            cnt[v] += 1
            while cnt[v] > k:
                cnt[nums[l]] -= 1
                l += 1
            ans = max(ans, i - l + 1)
        return ans

100140. 关闭分部的可行集合数目

100140. 关闭分部的可行集合数目

1. 题目描述

[LeetCode周赛复盘] 第 119 场双周赛20231209_第4张图片

2. 思路分析

  • n=10,因此考虑暴力枚举每种方案。也就1024种。
  • 每个方案求距离可以floyd。
  • roads有1000条,但n=10其实最多55条有效的(最短的)。直接预处理邻接矩阵即可。

3. 代码实现

class Solution:
    def numberOfSets(self, n: int, maxDistance: int, roads: List[List[int]]) -> int:
        d = [[inf]*n for _ in range(n)]
        for u,v,w in roads:
            d[u][v] = min(d[u][v], w)
            d[v][u] = min(d[v][u], w)        
                
        def f(t):
            ps = []
            dis = [[inf] * n for _ in range(n)]
            for u in range(n):
                if t >> u & 1:
                    dis[u][u] = 0
                    ps.append(u)
                    for v in range(n):
                        if t >> v & 1:
                            dis[u][v] = min(dis[u][v], d[u][v])

            for k in ps:
                for u in ps:
                    for v in ps:
                        dis[u][v] = min(dis[u][v], dis[u][k] + dis[k][v])

            for u in ps:
                for v in ps:
                    if dis[u][v] > maxDistance:
                        return False
            return True

        ans = 1
        for i in range(1,1 << n):
            ans += f(i)
        return ans 

参考链接

你可能感兴趣的:(力扣周赛复盘,leetcode,算法,职场和发展)