LeetCode笔记:Weekly Contest 302

Posted Espresso Macchiato

tags:

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

0. 序言

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

1. 题目一

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

1. 解题思路

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

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

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

2. 代码实现

给出python代码实现如下:

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代码实现如下:

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代码实现如下:

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代码实现如下:

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。

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314