LeetCode笔记:Weekly Contest 328

Posted Espresso Macchiato

tags:

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

1. 题目一

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

1. 解题思路

这一题翻译一下题目就行了,就是求一下list当中所有数字的和以及把每一个数拆分为digit然后求和比较绝对值的差即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def differenceOfSum(self, nums: List[int]) -> int:
        s = sum(nums)
        
        def digit(num):
            return sum(int(d) for d in str(num))
        
        t = sum(digit(x) for x in nums)
        return abs(s-t)

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

2. 题目二

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

1. 解题思路

这一题其实也简单,就是一个二维累积数组的问题。

我们对于每一个query,在边界位置标记好累积变化值,然后对整体的矩阵进行累计求和之后就能够得到最终的matrix上面每一个元素的具体的值了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def rangeAddQueries(self, n: int, queries: List[List[int]]) -> List[List[int]]:
        matrix = [[0 for _ in range(n+1)] for _ in range(n+1)]
        for a, b, c, d in queries:
            matrix[a][b] += 1
            matrix[c+1][b] -= 1
            matrix[a][d+1] -= 1
            matrix[c+1][d+1] += 1
        
        for j in range(n):
            matrix[0][j+1] += matrix[0][j]
        for i in range(1, n):
            matrix[i][0] += matrix[i-1][0]
            for j in range(1, n+1):
                matrix[i][j] = matrix[i][j] + matrix[i-1][j] + matrix[i][j-1] - matrix[i-1][j-1]
        return [line[:-1] for line in matrix[:-1]]

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

3. 题目三

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

1. 解题思路

这一题我的思路是考察遍历每一个位置作为左边界时,要使得满足good subarray条件,最近的右边界的位置在哪里,此时往后所有的位置都可以满足good subarray的条件,且右边界是单调的,因此我们可以通过一个滑动窗口在 O ( N ) O(N) O(N)的时间复杂度内搞定这道题。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countGood(self, nums: List[int], k: int) -> int:
        n = len(nums)
        i, j, t = 0, 0, 0
        cnt = defaultdict(int)
        res = 0
        while i < n:
            while j < n and t < k:
                t -= cnt[nums[j]] * (cnt[nums[j]] - 1) // 2
                cnt[nums[j]] += 1
                t += cnt[nums[j]] * (cnt[nums[j]] - 1) // 2
                j += 1
            if t >= k:
                res += (n-j+1)
                t -= cnt[nums[i]] * (cnt[nums[i]] - 1) // 2
                cnt[nums[i]] -= 1
                t += cnt[nums[i]] * (cnt[nums[i]] - 1) // 2
                i += 1
            else:
                break
        return res

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

4. 题目四

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

1. 解题思路

这一题没有想到啥好的思路,就是遍历一下一下每一个点作为root时的答案,然后找出最大值。

而在每一个点作为root的情况下,其最小的路径就是其本身,最大的路径则可以通过一个单向遍历来获得,不过这里没有想到啥特别好的思路,就简单的试了一下暴力地动态规划,结果没有超时,能够通过测试样例,就先这样了……

如果有更好的思路,也欢迎大家分享。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxOutput(self, n: int, edges: List[List[int]], price: List[int]) -> int:
        if n == 1:
            return 0
        
        graph = defaultdict(list)
        for u, v in edges:
            graph[u].append(v)
            graph[v].append(u)
            
        @lru_cache(None)
        def dfs(u, pre):
            if len(graph[u]) == 1 and pre != -1:
                return price[u]
            else:
                return price[u] + max(dfs(v, u) for v in graph[u] if v != pre)
            
        return max(dfs(u, -1) - price[u] for u in range(n))

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

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314