LeetCode笔记:Biweekly Contest 108

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

1. 题目一

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

  • 2765. Longest Alternating Subarray

1. 解题思路

这一题我的思路就是使用贪婪算法,不断地考虑每一个点作为起点时可以组成的最长情况即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def alternatingSubarray(self, nums: List[int]) -> int:
        res, cnt, pre, delta = 0, 0, -1, 1
        for x in nums:
            if x == pre + delta:
                cnt += 1
                delta = -delta
            elif x == pre + 1:
                res = max(res, cnt)
                delta = -1
                cnt = 2
            else:
                res = max(res, cnt)
                delta = 1
                cnt = 1
            pre = x
        res = max(res, cnt)
        return res if res > 1 else -1

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

2. 题目二

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

  • 2766. Relocate Marbles

1. 解题思路

这一题我们只需要记录下每一个时刻所有占据的位置,然后按照题目的描述走一遍流程即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def relocateMarbles(self, nums: List[int], moveFrom: List[int], moveTo: List[int]) -> List[int]:
        positions = set(nums)
        for x, y in zip(moveFrom, moveTo):
            if x in positions:
                positions.remove(x)
                positions.add(y)
        return sorted(positions)

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

3. 题目三

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

  • 2767. Partition String Into Minimum Beautiful Substrings

1. 解题思路

这一题就是一个动态规划的思路,不断地考察以每一个点作为起点时后续能够构成的合法切分的最小个数然后返回即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimumBeautifulSubstrings(self, s: str) -> int:
        n = len(s)
        
        def is_power5(x):
            while x % 5 == 0:
                x = x // 5
            return x == 1
        
        @lru_cache(None)
        def dp(idx):
            if idx >= n:
                return 0
            if s[idx] == "0":
                return math.inf
            res = math.inf
            x = 0
            for i in range(idx, n):
                x = x * 2 + int(s[i])
                if is_power5(x):
                    res = min(res, 1 + dp(i+1))
            return res
        
        res = dp(0)
        return res if res != math.inf else -1

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

4. 题目四

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

  • 2768. Number of Black Blocks

1. 解题思路

这一题其实整体还是很简单的,就是从黑色格子开始考察,考虑每一个包含黑盒子的block当中含有的黑盒子的个数,然后剩余的就是完全不包含黑盒子的block的个数。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countBlackBlocks(self, m: int, n: int, coordinates: List[List[int]]) -> List[int]:
        cnt = defaultdict(int)
        black_cells = {(x, y) for x, y in coordinates}
        seen = set()
        for x, y in coordinates:
            for i in [-1, 0]:
                for j in [-1, 0]:
                    if 0 <= x+i < m-1 and 0 <= y+j < n-1 and (x+i, y+j) not in seen:
                        s = [1 for a in range(2) for b in range(2) if (x+i+a, y+j+b) in black_cells]
                        cnt[len(s)] += 1
                        seen.add((x+i, y+j))
        cnt[0] = (n-1) * (m-1) - cnt[1] - cnt[2] - cnt[3] - cnt[4]
        return [cnt[i] for i in range(5)]

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

你可能感兴趣的:(leetcode笔记,力扣双周赛108,leetcode,2765,leetcode,2766,leetcode,2767,leetcode,2768)