LeetCode笔记:Weekly Contest 249(补发)
Posted 墨客无言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 249(补发)相关的知识,希望对你有一定的参考价值。
1. 题目一
给出题目一的试题链接如下:
1. 解题思路
这一题坦率地说水的过分了,就是重复一下数组就行了。
2. 代码实现
给出python代码实现如下:
class Solution:
def getConcatenation(self, nums: List[int]) -> List[int]:
return nums + nums
提交代码评测得到:耗时120ms,占用内存14.5MB。
当前最优的算法实现耗时68ms,采用的方式是使用内置的extend函数,不过本质上没啥区别。
2. 题目二
给出题目二的试题链接如下:
1. 解题思路
这里,由于同排序的字符串不考虑其在原始字符串当中的位置信息,因此,我们只需要遍历所有的26个字符,找到其第一个和最后一个字符(如果其存在于该字符串当中的话),然后统计其中存在的所有的字符的种类,即为其可以组成的不同的回文字符串的数目。
对26个字符的结果进行求和即可得到最终的答案。
2. 代码实现
给出python代码实现如下:
class Solution:
def countPalindromicSubsequence(self, s: str) -> int:
n = len(s)
r = s[::-1]
res = 0
for c in string.ascii_lowercase:
if s.find(c) == -1:
continue
i, j = s.find(c), n-r.find(c)
if i == j-1:
continue
res += len(Counter(s[i+1:j-1]))
return res
提交代码评测得到:耗时584ms,占用内存15.2MB。
当前最优的算法实现耗时40ms,他的思路和我们是一样的,但是其实现方面采用的是python内置的find()
和rfind()
方法,后续的统计也不是使用Counter
的方式,而是进一步遍历,然后通过find()
函数确认是否存在对应的字符。
3. 题目三
给出题目三的试题链接如下:
1. 解题思路
这一题一开始没看清题目,当成一般的n*m问题来解了,结果就死活搞不定,感觉是一个递推问题,但是关系式死活想不出来。
后来看了答案之后惊呆了,因为发现行数最多只能是5,然后看了一下别人的解答,基本就是以列为单位进行暴力枚举,简直惊呆了……
不过这么一来题目就简单多了,只需要事先计算好每一个状态的转移矩阵,然后递推计算一下就行了。
2. 代码实现
给出python代码实现如下:
class Solution:
def colorTheGrid(self, m: int, n: int) -> int:
MOD = 10**9+7
nxt = {"init": [s for s in product([0,1,2], repeat=m) if all(s[i] != s[i+1] for i in range(m-1))]}
for s in nxt["init"]:
nxt[s] = [t for t in nxt["init"] if all(s[i] != t[i] for i in range(m))]
@lru_cache(None)
def dp(i, status):
if i == n:
return 1
res = 0
for s in nxt[status]:
res = res + dp(i+1, s)
return res % MOD
return dp(0, "init")
提交代码评测得到:耗时1092ms,占用内存35.5MB。
4. 题目四
给出题目四的试题链接如下:
1. 解题思路
不想做了,直接上官方解答吧……
官方解答:合并多棵二叉搜索树
以上是关于LeetCode笔记:Weekly Contest 249(补发)的主要内容,如果未能解决你的问题,请参考以下文章