前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode笔记:Weekly Contest 218 比赛记录

LeetCode笔记:Weekly Contest 218 比赛记录

作者头像
codename_cys
发布2021-03-27 23:02:30
2920
发布2021-03-27 23:02:30
举报
文章被收录于专栏:我的充电站我的充电站

1. 题目一

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

1. 解题思路

这一题没啥可说的,不断地进行内容替换就行了。

2. 代码实现

直接给出python代码实现如下:

代码语言:javascript
复制
class Solution:
    def interpret(self, command: str) -> str:
        command = command.replace("(al)", "al")
        command = command.replace("()", "o")
        return command

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

当前的最优解法耗时24ms,但是看了一下其代码,本质上和上述实现是完全一致的,因此这里就不再多做展开了。

2. 题目二

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

1. 解题思路

这一题的思路同样异常的直白,只要对数组中所有的数进行计数,然后考察其中加起来等于k的二元组的数据数量即可。

唯一需要注意的是边界条件需要注意一下:

  • i == k / 2时,需要特殊考察。

2. 代码实现

给出python代码实现:

代码语言:javascript
复制
class Solution:
    def maxOperations(self, nums: List[int], k: int) -> int:
        counter = Counter(nums)
        ans = 0
        for i in counter:
            if i < k-i:
                ans += min(counter[i], counter[k-i])
            elif i == k-i:
                ans += counter[i] // 2
            else:
                continue
        return ans

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

当前最优的代码实现耗时608ms,但是本质来说两者的思路是完全相同的。

3. 题目三

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

1. 解题思路

这一题的思路其实也蛮简单的,无非就是依据下面的公式而已:

因此,我们只需要每次计算需要移动的位数,然后对前一次的答案做一次变换之后然后求取下一个解即可。

2. 代码实现

我们给出python代码实现如下:

代码语言:javascript
复制
class Solution:
    def concatenatedBinary(self, n: int) -> int:
        flag = 1
        logits = 0
        ans = 0
        MOD = 10**9 + 7
        for i in range(1, n+1):
            if i == flag:
                flag *= 2
                logits += 1
            ans = ((ans << logits) + i) % MOD
        return ans

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

当前最优的代码实现耗时仅44ms,比我们有一个量级以上的性能提升,因此,我们需要好好考察一下其代码实现思路。

3. 算法优化

当前最优的代码实现,即44ms的那个代码有点繁琐,就没细看,但值得一说的是,另有一个耗时80ms的算法时间简直崩碎了我的三观,本质上来说他们的做法和我们是一模一样的,但是他们用了一个缓存机制,然后模型奇妙的效果提升了一个量级,简直理解不能。

如果有读者明白其中的奥秘所在的话,请务必在评论区指导一下,大谢!

这里,我们只给出其代码实现如下:

代码语言:javascript
复制
memo={1:1}
mod=10**9+7
class Solution:
    def concatenatedBinary(self, n: int) -> int:
        if n in memo:
            return memo[n]
        pre=self.concatenatedBinary(n-1)
        ans=((pre<<(len(bin(n))-2))+n)%mod
        memo[n]=ans
        return ans

4. 题目四

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

1. 解题思路

如果换用组合数来进行遍历求解的话事实上也就没有什么好多说的,下面直接给出python实现吧。

2. 代码实现

给出python代码实现如下:

代码语言:javascript
复制
class Solution:
    def minimumIncompatibility(self, nums: List[int], k: int) -> int:
        n= len(nums)
        k = n // k
        
        if k == 1:
            return 0
        counter = Counter(nums)
        if any(x > n // k for x in counter.values()):
            return -1
        
        @lru_cache(None)
        def dp(idxs):
            if len(idxs) == k:
                num = [nums[i] for i in idxs]
                return math.inf if len(set(num)) != k else max(num) - min(num)
            ans = math.inf
            for tmp in combinations(idxs, k):
                num = [nums[i] for i in tmp]
                if len(set(num)) == k:
                    ans = min(ans, max(num) - min(num) + dp(tuple([idx for idx in idxs if idx not in tmp])))
            return ans
        
        ans = dp(tuple([i for i in range(n)]))
        return ans if ans != math.inf else -1

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

当前最优的代码实现耗时1252ms,比我们快了5倍以上,但是代码有够长的,后面再看看有没有更好的解题思路吧。

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

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

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

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