LeetCode笔记:Weekly Contest 297

Posted Espresso Macchiato

tags:

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

1. 题目一

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

1. 解题思路

这一题就是按照题意计算一下累积计税就行了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def calculateTax(self, brackets: List[List[int]], income: int) -> float:
        pre = 0
        tax = 0
        for u, p in brackets:
            tax += p * (min(u, income) - pre) / 100
            pre = u
            if pre >= income:
                break
        return tax

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

2. 题目二

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

1. 解题思路

这一题就是一个简单的动态规划题目,借用cache基本顺着思路下来就完事了,就不过多赘述了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minPathCost(self, grid: List[List[int]], moveCost: List[List[int]]) -> int:
        n, m = len(grid), len(grid[0])
        
        @lru_cache(None)
        def dp(i, j):
            if i == n-1:
                return grid[i][j]
            
            return min(grid[i][j] + moveCost[grid[i][j]][k] + dp(i+1, k) for k in range(m))
        
        return min(dp(0, k) for k in range(m))

提交代码评测得到:耗时2413ms,占用内存20ms。

3. 题目三

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

1. 解题思路

这一题我的思路就是不同的遍历加上剪枝。

首先通过深度优先遍历来找出所有的可能组合,然后通过剪枝的方式去除掉所有不可能的组合,从而大幅减小时间复杂度。

2. 代码实现

给出python代码实现如下:

class Solution:
    def distributeCookies(self, cookies: List[int], k: int) -> int:
        n = len(cookies)
        
        res = math.inf
        cnt = [0 for _ in range(k)]
        
        def dfs(idx):
            nonlocal res, cnt
            if idx == n:
                res = min(res, max(cnt))
                return
            for i in range(k):
                if cnt[i] + cookies[idx] >= res:
                    continue
                cnt[i] += cookies[idx]
                dfs(idx+1)
                cnt[i] -= cookies[idx]
            return 
        
        dfs(0)
        return res

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

4. 题目四

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

1. 解题思路

这一题很丢脸的没能自己搞定,看了大佬们的解答之后发现这一题其实挺简单的,只需要转换一下思路就行了。

这一题的关键在于说转换一下思路,不是去考察尾部的字符,而是直接考察首字母变换的可能性。

freq[(u, v)]表示首字母为u的单词变成首字母为v的单词时可行的变换数目。

从而,对任意的freq[(u, v)] * freq[(v, u)]就可以表示首字母为uv的两个idea之间可行的组合数目。

2. 代码实现

给出python代码实现如下:

class Solution:
    def distinctNames(self, ideas: List[str]) -> int:
        ideaset = set(ideas)
        freq = defaultdict(int)
        for idea in ideas:
            for ch in string.ascii_lowercase:
                change = ch + idea[1:]
                if change not in ideaset:
                    freq[(idea[0], ch)] += 1
        
        res = 0
        for u in string.ascii_lowercase:
            for v in string.ascii_lowercase:
                if u == v:
                    continue
                res += freq[(u, v)] * freq[(v, u)]
        return res

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

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314