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

LeetCode笔记:Weekly Contest 302

作者头像
codename_cys
发布2022-08-23 11:14:52
4440
发布2022-08-23 11:14:52
举报
文章被收录于专栏:我的充电站

0. 序言

这一次的比赛整体上来说感觉算是比较简单的,第一名的大佬也就花了7分钟,实际我在做的时候也没有感受到啥思路上的瓶颈,基本上按部就班就把4道题都搞定了,整体上来说没啥感觉……

1. 题目一

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

1. 解题思路

这一题的答案,其实只需要考察最后能够留下来的数字就可以了。

而最后能够留下来的数字,有且仅有原数组当中个数为奇数的数字。

由此,我们就可以获得最终的答案了。

2. 代码实现

给出python代码实现如下:

代码语言:javascript
复制
class Solution:
    def numberOfPairs(self, nums: List[int]) -> List[int]:
        n = len(nums)
        cnt = Counter(nums)
        remain = len([x for x in cnt if cnt[x] % 2 == 1])
        return [(n-remain)//2, remain]

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

2. 题目二

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

1. 解题思路

这一题思路上也很直接,我们将所有的数字按照位数之和进行归类,然后对每一个含有2个或2个以上的数字的组别当中取得最大的两个数求和,然后取出最大值即可。

2. 代码实现

给出python代码实现如下:

代码语言:javascript
复制
class Solution:
    def maximumSum(self, nums: List[int]) -> int:
        def cal_digits(x):
            res = 0
            while x:
                res += x % 10
                x = x // 10
            return res
        
        cache = defaultdict(list)
        for x in nums:
            cache[cal_digits(x)].append(x)
        
        res = -1
        for k in cache:
            if len(cache[k]) == 1:
                continue
            s = sorted(cache[k])
            res = max(res, s[-1] + s[-2])
        return res

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

3. 题目三

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

1. 解题思路

这一题,我们的思路来说就是对每一个截断的trim预先的先得到对应的数组,然后排序完成,然后,我们就只需要对于每一个query找到对应的trim下的数组,然后找到第k小的元素即可。

2. 代码实现

给出python代码实现如下:

代码语言:javascript
复制
class Solution:
    def smallestTrimmedNumbers(self, nums: List[str], queries: List[List[int]]) -> List[int]:
        n = len(nums[0])
        mem = {}
        for i in range(n+1):
            s = [(x[-i:], idx) for idx, x in enumerate(nums)]
            mem[i] = [x[1] for x in sorted(s)]
        
        res = [mem[trim][k-1] for k, trim in queries]
        return res

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

4. 题目四

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

1. 解题思路

这一题的思路也是很简单,我们只需要先找出来numsDivide数组当中的最大公约数s,然后,只需要找出nums当中最小的一个s的约数即可。

2. 代码实现

给出python代码实现如下:

代码语言:javascript
复制
class Solution:
    def minOperations(self, nums: List[int], numsDivide: List[int]) -> int:
        nums = sorted(nums)
        if nums[0] == 1:
            return 0
        
        s = numsDivide[0]
        for x in numsDivide[1:]:
            s = math.gcd(s, x)
            if s == 1:
                break
        
        for idx, x in enumerate(nums):
            if x > s:
                return -1
            elif s % x == 0:
                return idx
        return -1

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

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

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

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

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

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