给出题目一的试题链接如下:
这一题就是按照题目给出的条件重新转义一下字符串即可,倒是不用怎么多说。
给出python代码实现如下:
class Solution:
def finalString(self, s: str) -> str:
out = ""
for ch in s:
if ch == "i":
out = out[::-1]
else:
out = out + ch
return out
提交代码评测得到:耗时50ms,占用内存16.3MB。
给出题目二的试题链接如下:
这一题其实就是个脑筋急转弯,不难想到,事实上,只要存在两个相邻的数加和大于目标值,然后总是存在一种切分方法对数组进行切分。
反之,也不难思考,如果所有相邻元素的加和均小于目标值,那么一定无法将目标数组切分为单一元素的子序列,只要考虑一下连续三个元素的切分即可。
因此,答案事实上就变成一行代码的事了。
给出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。
给出题目三的试题链接如下:
这一题我的实现上多少有一些复杂,不过思路上倒是非常清晰的,就是分两步。
第一步求出每一个位置上的safeness factor,这个用一个bfs即可完成。
第二步就是求一条连通路径,使得从起点到终点的safeness factor最大。这个用一个dsu即可实现,我们只需要按照safeness factor对所有的格子进行倒序排序,然后不断地将其进行聚类,直到起点和终点被连通为止,此时的safeness factor就是可以获得的最大的safeness factor。
给出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] = x
return
class 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+1
q.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+1
q.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+1
q.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+1
q.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。
给出题目四的试题链接如下:
这一题说来惭愧,实在是没啥思路,看了其他大佬们的一些解答,也没怎么看明白,所以这里就不班门弄斧了,后面有时间我再想想吧,这里就先放弃了……