LeetCode笔记:Weekly Contest 245(补发)
Posted 墨客无言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 245(补发)相关的知识,希望对你有一定的参考价值。
1. 题目一
给出题目一的试题链接如下:
1. 解题思路
这一题其实挺简单的,因为题目中给出的操作事实上可以完成包括某一字符串内部的顺序互换以及两字符串之间的子串穿插等全部操作。
因此,事实上最终我们只需要比较所有字符串之中的各个字符的计数是否能够被元素个数整除,只要它能够整除,就一定可以通过某一系列的操作使得其最终达到相互相同的情况。
2. 代码实现
给出python代码实现如下:
class Solution:
def makeEqual(self, words: List[str]) -> bool:
cnt = defaultdict(int)
for s in words:
for c in s:
cnt[c] += 1
n = len(words)
return all(x % n == 0 for x in cnt.values())
提交代码评测得到:耗时56ms,占用内存14.3MB。
2. 题目二
给出题目二的试题链接如下:
1. 解题思路
这一题同样比较惭愧,没能想到比较靠谱的解法,最终就只能够暴力求解了,唯一算是优化的地方就是使用二分法进行临界点的查找,但是也不算多么巧妙,只能说万幸没有遇到超时问题……
2. 代码实现
给出python代码实现如下:
class Solution:
def maximumRemovals(self, s: str, p: str, removable: List[int]) -> int:
def get_substring(s, k):
invalid = set(removable[:k])
res = "".join([c for i, c in enumerate(s) if i not in invalid])
return res
def is_substring(s, p):
i, j, n, m = 0, 0, len(s), len(p)
while i < n and j < m:
while i < n and s[i] != p[j]:
i += 1
if i >= n:
break
i += 1
j += 1
return j >= m
i, j = 0, len(removable)+1
while i < j-1:
m = (i+j) // 2
if is_substring(get_substring(s, m), p):
i = m
else:
j = m
return i
提交代码评测得到:耗时3476ms,占用内存27.7MB。
3. 题目三
给出题目三的试题链接如下:
1. 解题思路
这一题较之上一题就水了非常多。
根据题目中操作的本质,任何操作都会对三元组中的每一个元素取极值,因此,对于任何一个存在某一元素大于目标三元组中对应位置上的元素的三元组,都是无法被我们使用的三元组。
从而,我们只需要将剩余的所有三元组全部留存下来进行以下操作,看一下是否能够能够获得最终的目标三元组即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def mergeTriplets(self, triplets: List[List[int]], target: List[int]) -> bool:
triplets = [it for it in triplets if all(x <= y for x, y in zip(it, target))]
if len(triplets) == 0:
return False
x = max([it[0] for it in triplets])
y = max([it[1] for it in triplets])
z = max([it[2] for it in triplets])
return x == target[0] and y == target[1] and z == target[2]
提交代码评测得到:耗时2140ms,占用内存59.7MB。
4. 题目四
给出题目四的试题链接如下:
同样的,这题我也放弃了,想了一周多,没想出解法,看答案也没啥思路,放弃了吧……
以上是关于LeetCode笔记:Weekly Contest 245(补发)的主要内容,如果未能解决你的问题,请参考以下文章