- LeetCode笔记:Weekly Contest 357
- 1. 题目一
- 1. 解题思路
- 2. 代码实现
- 2. 题目二
- 1. 解题思路
- 2. 代码实现
- 3. 题目三
- 1. 解题思路
- 2. 代码实现
- 4. 题目四
- 1. 题目一
- 比赛链接:https://leetcode.com/contest/weekly-contest-357
1. 题目一
给出题目一的试题链接如下:
- 2810. Faulty Keyboard
1. 解题思路
这一题就是按照题目给出的条件重新转义一下字符串即可,倒是不用怎么多说。
2. 代码实现
给出python代码实现如下:
class Solution:def finalString(self, s: str) -> str:out = ""for ch in s:if ch == "i":out = out[::-1]else:out = out + chreturn out
提交代码评测得到:耗时50ms,占用内存16.3MB。
2. 题目二
给出题目二的试题链接如下:
- 2811. Check if it is Possible to Split Array
1. 解题思路
这一题其实就是个脑筋急转弯,不难想到,事实上,只要存在两个相邻的数加和大于目标值,然后总是存在一种切分方法对数组进行切分。
反之,也不难思考,如果所有相邻元素的加和均小于目标值,那么一定无法将目标数组切分为单一元素的子序列,只要考虑一下连续三个元素的切分即可。
因此,答案事实上就变成一行代码的事了。
2. 代码实现
给出python代码实现如下:
class Solution:def canSplitArray(self, nums: List[int], m: int) -> bool:n = len(nums)return n <= 2 or any(nums[i] + nums[i+1] >= m for i in range(n-1))
提交代码评测得到:耗时55ms,占用内存16.2MB。
3. 题目三
给出题目三的试题链接如下:
- 2812. Find the Safest Path in a Grid
1. 解题思路
这一题我的实现上多少有一些复杂,不过思路上倒是非常清晰的,就是分两步。
第一步求出每一个位置上的safeness factor,这个用一个bfs即可完成。
第二步就是求一条连通路径,使得从起点到终点的safeness factor最大。这个用一个dsu即可实现,我们只需要按照safeness factor对所有的格子进行倒序排序,然后不断地将其进行聚类,直到起点和终点被连通为止,此时的safeness factor就是可以获得的最大的safeness factor。
2. 代码实现
给出python代码实现如下:
class DSU:def __init__(self, n):self.root = {(i,j): (i,j) for i in range(n) for j in range(n)}def find(self, p):if self.root[p] != p:self.root[p] = self.find(self.root[p])return self.root[p]def union(self, a, b):x = self.find(a)y = self.find(b)self.root[y] = xreturnclass Solution:def maximumSafenessFactor(self, grid: List[List[int]]) -> int:n = len(grid)factors = [[0 for _ in range(n)] for _ in range(n)]q = [[i, j, 0] for i in range(n) for j in range(n) if grid[i][j] == 1]seen = {(i, j) for i, j, _ in q}while q:i, j, d = q.pop(0)if i-1 >= 0 and (i-1, j) not in seen:factors[i-1][j] = d+1q.append((i-1, j, d+1))seen.add((i-1, j))if i+1 < n and (i+1, j) not in seen:factors[i+1][j] = d+1q.append((i+1, j, d+1))seen.add((i+1, j))if j-1 >= 0 and (i, j-1) not in seen:factors[i][j-1] = d+1q.append((i, j-1, d+1))seen.add((i, j-1))if j+1 < n and (i, j+1) not in seen:factors[i][j+1] = d+1q.append((i, j+1, d+1))seen.add((i, j+1))dsu = DSU(n)s = sorted([(i, j) for i in range(n) for j in range(n)], key=lambda x: factors[x[0]][x[1]], reverse=True)for i, j in s:if i-1 >= 0 and factors[i-1][j] >= factors[i][j]:dsu.union((i-1, j), (i, j))if i+1 < n and factors[i+1][j] >= factors[i][j]:dsu.union((i+1, j), (i, j))if j-1 >= 0 and factors[i][j-1] >= factors[i][j]:dsu.union((i, j-1), (i, j))if j+1 < n and factors[i][j+1] >= factors[i][j]:dsu.union((i, j+1), (i, j))if dsu.find((0, 0)) == dsu.find((n-1, n-1)):return factors[i][j]return 0
提交代码评测得到:耗时5276ms,占用内存90.3MB。
4. 题目四
给出题目四的试题链接如下:
- 2813. Maximum Elegance of a K-Length Subsequence
这一题说来惭愧,实在是没啥思路,看了其他大佬们的一些解答,也没怎么看明白,所以这里就不班门弄斧了,后面有时间我再想想吧,这里就先放弃了……