LeetCode笔记:Weekly Contest 302

本文分享了LeetCode Weekly Contest 302中四个问题的解题思路与Python代码实现,涉及最大奇数对、数字和相等对、查询最小修剪数和使数组可整除的操作。轻松理解算法并提升编码能力。

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。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值