LeetCode笔记:Weekly Contest 314

Posted Espresso Macchiato

tags:

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

1. 题目一

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

1. 解题思路

这一题就是首先计算出来每个任务的耗时,然后取出最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def hardestWorker(self, n: int, logs: List[List[int]]) -> int:
        t = [0 for _ in range(n)]
        st = 0
        for idx, ed in logs:
            t[idx] = max(t[idx], ed - st)
            st = ed
        
        _max = 0
        res = 0
        for i in range(n):
            if t[i] > _max:
                res = i
                _max = t[i]
        return res

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

2. 题目二

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

1. 解题思路

这一题其实就是利用性质:a xor a xor b = b,因此,我们对整个数组进行逆推即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def findArray(self, pref: List[int]) -> List[int]:
        n = len(pref)
        for i in range(n-1):
            pref[n-1-i] = pref[n-1-i] ^ pref[n-2-i]
        return pref

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

3. 题目三

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

1. 解题思路

这一题我的思路还是比较暴力的,显然,我们要让输出结果字典序最小,那么就得优先打印最小的字符,而没打印一个字符,其前序的所有字符的顺序就已经基本固定了。

因此,我们只需要遍历字母表,从小到大依次顺序打印出当前最后一个位置之后包含的字符即可。

唯一特殊一些的是,有一个特殊情况,即如果一个字符被打印之后到下一个字符被打印之前,如果刚好前序存在还未打印的小字符,那么需要优先打印那些。

综上,我们就可以最终获得我们的结果。

2. 代码实现

给出python代码实现如下:

class Solution:
    def robotWithString(self, s: str) -> str:
        n = len(s)
        used = [0 for _ in s]
        last = 0
        res = ""
        for ch in string.ascii_lowercase:
            while last-1 >= 0 and s[last-1] <= ch:
                if used[last-1] == 0:
                    res += s[last-1]
                    used[last-1] = 1
                last -= 1
            for i, c in enumerate(s):
                if i >= last and c == ch and used[i] == 0:
                    res += ch
                    last = i
                    used[i] = 1
        s = "".join([ch for i, ch in enumerate(s) if used[i] == 0])
        return res + s[::-1]

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

4. 题目四

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

1. 解题思路

这一题有点坑爹,思路上我看了一下别人的解法,基本其实大家都一样,就是一个简单的动态规划,不过我一开始用的是cache,然后居然超时了,然后换成了数组,就能够通过,至于吗这……

2. 代码实现

给出python代码实现如下:

class Solution:
    def numberOfPaths(self, grid: List[List[int]], k: int) -> int:
        MOD = 10**9 + 7
        
        n, m = len(grid), len(grid[0])
        dp = [[[0 for _ in range(k)] for _ in range(m)] for _ in range(n)]
        dp[0][0][grid[0][0] % k] = 1
        for i in range(n):
            for j in range(m):
                for mod in range(k):
                    if i-1 >= 0:
                        dp[i][j][mod] = (dp[i][j][mod] + dp[i-1][j][(mod-grid[i][j]) % k]) % MOD
                    if j-1 >= 0:
                        dp[i][j][mod] = (dp[i][j][mod] + dp[i][j-1][(mod-grid[i][j]) % k]) % MOD
        return dp[n-1][m-1][0]

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

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314