首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LeetCode笔记:Weekly Contest 297

LeetCode笔记:Weekly Contest 297

作者头像
codename_cys
发布2022-06-14 15:56:56
发布2022-06-14 15:56:56
2320
举报
文章被收录于专栏:我的充电站我的充电站

1. 题目一

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

1. 解题思路

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

2. 代码实现

给出python代码实现如下:

代码语言:javascript
复制
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代码实现如下:

代码语言:javascript
复制
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代码实现如下:

代码语言:javascript
复制
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代码实现如下:

代码语言:javascript
复制
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。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目一
    • 1. 解题思路
    • 2. 代码实现
  • 2. 题目二
    • 1. 解题思路
    • 2. 代码实现
  • 3. 题目三
    • 1. 解题思路
    • 2. 代码实现
  • 4. 题目四
    • 1. 解题思路
    • 2. 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档