LeetCode笔记:Weekly Contest 292

Posted Espresso Macchiato

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 292相关的知识,希望对你有一定的参考价值。

1. 题目一

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

1. 解题思路

这一题思路上倒是没啥,直接比较一下连续三个数就行了,不是很高效的解法,因为有大量的重复比较,不过对于easy级别的题目也够了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def largestGoodInteger(self, num: str) -> str:
        res = ""
        n = len(num)
        for i in range(n-2):
            if num[i] == num[i+1] == num[i+2]:
                if res == "" or int(res) < int(num[i:i+3]):
                    res = num[i:i+3]
        return res

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

2. 题目二

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

1. 解题思路

这一题同样的本质上就是一个二叉树的后序遍历,不过遍历的时候需要返回一下子树中节点的总数和value之和就是了。

2. 代码实现

给出python代码实现如下:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def averageOfSubtree(self, root: Optional[TreeNode]) -> int:
        res = 0
        
        def dfs(root):
            nonlocal res
            
            if root is None:
                return 0, 0
            lsum, lcnt = dfs(root.left)
            rsum, rcnt = dfs(root.right)
            s = lsum + rsum + root.val
            cnt = lcnt + rcnt + 1
            if s // cnt == root.val:
                res += 1
            return s, cnt
        
        dfs(root)
        return res

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

3. 题目三

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

1. 解题思路

这一题同样就是一个动态规划的问题。

不过在此基础上我们可以进一步地进行优化,只需要将连续数字分别进行考察,然后结果相乘就是最终的答案。

而对于连续数字,我们可以进一步抽象到对应的字符数目和长度,然后就是一个比较标准的动态规划的题目了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countTexts(self, pressedKeys: str) -> int:
        MOD = 10**9 + 7
        modes = [3, 3, 3, 3, 3, 4, 3, 4]
        
        @lru_cache(None)
        def dp(mode, cnt):
            if cnt == 0:
                return 1
            return sum(dp(mode, cnt-i) for i in range(1, min(mode, cnt)+1)) % MOD
        
        res = 1
        cnt = 0
        pre = ""
        for ch in pressedKeys:
            if ch == pre:
                cnt += 1
            else:
                if pre != "":
                    res = (res * dp(modes[ord(pre) - ord("2")], cnt)) % MOD
                pre = ch
                cnt = 1
        
        res = (res * dp(modes[ord(pre) - ord("2")], cnt)) % MOD
        return res

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

4. 题目四

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

1. 解题思路

这一题也差不多就是一个动态规划的题目,我们只需要依次将所有可行的路线找出来,然后用一个堆排优先找寻最为平衡的到达终点的路线即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def hasValidPath(self, grid: List[List[str]]) -> bool:
        n, m = len(grid), len(grid[0])
        if grid[0][0] == ")" or grid[-1][-1] == "(":
            return False
        
        seen = (1, 0, 0)
        q = [(1, 0, 0)]
        while q:
            cnt, i, j = heapq.heappop(q)
            if i == n-1 and j == m-1:
                return cnt == 0
            if i+1 < n:
                if grid[i+1][j] == "(":
                    if (cnt+1, i+1, j) in seen:
                        continue
                    heapq.heappush(q, (cnt+1, i+1, j))
                    seen.add((cnt+1, i+1, j))
                else:
                    if cnt > 0:
                        if (cnt+1, i+1, j) in seen:
                            continue
                        heapq.heappush(q, (cnt-1, i+1, j))
                        seen.add((cnt-1, i+1, j))
            if j+1 < m:
                if grid[i][j+1] == "(":
                    if (cnt+1, i, j+1) in seen:
                        continue
                    heapq.heappush(q, (cnt+1, i, j+1))
                    seen.add((cnt+1, i, j+1))
                else:
                    if cnt > 0:
                        if (cnt-1, i, j+1) in seen:
                            continue
                        heapq.heappush(q, (cnt-1, i, j+1))
                        seen.add((cnt-1, i, j+1))
        return False

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

以上是关于LeetCode笔记:Weekly Contest 292的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314