LeetCode笔记:Weekly Contest 235 比赛记录

本文记录了LeetCode周赛235的四道题目解题思路与Python代码实现,包括句子截断、用户活跃分钟统计、最小绝对差之和及不同子序列最大公因数的计数。对于每道题目,作者分析了问题关键并提供了高效解决方案,部分题目使用了二分搜索等算法优化。尽管某些解法看似时间复杂度较高,但实际评测结果显示代码运行效率良好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 赛后总结

果然还是翘掉了周日的比赛,虽然其实当时酒已经醒的差不多了,至少头不晕了,但是怎么说的,还是懒,就赖过去了……

慢慢补做比赛吧……

1. 题目一

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

1. 解题思路

这一题依然没啥好多说的,只要将句子分词之后然后保留前k个词,然后恢复成句子就行了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def truncateSentence(self, s: str, k: int) -> str:
        s = s.split()[:k]
        return " ".join(s)

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

2. 题目二

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

1. 解题思路

这一题难度感觉还是在读题目上,把题目看懂了,基本题目也就搞定了。

说白了就是根据log先对每一个用户id统计他们所有操作发生的时间,然后记录下他们的uam次数,然后在用一个list记录下来即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def findingUsersActiveMinutes(self, logs: List[List[int]], k: int) -> List[int]:
        uam = defaultdict(set)
        for u, t in logs:
            uam[u].add(t)
        uam = {u: len(v) for u, v in uam.items()}
        res = [0 for _ in range(k)]
        for cnt in uam.values():
            res[cnt-1] += 1
        return res

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

3. 题目三

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

1. 解题思路

这一题的思路也挺直接的,就是想办法进行替换就是了,不过比较坑爹的是只能从原数组中的数字内寻求替换,因此就搜索范围只能在原数组中找寻和目标数字(nums2中的对应数字)最为接近的数。

如果直接搜索的话显然容易超时,因此,我们采用二分搜索的方式进行搜索,整体的时间复杂度就在 O ( N l o g N ) O(NlogN) O(NlogN)范围。

当然,这里我并没有做剪枝,如果先根据绝对值之差做一个排序,然后再进行一定的剪枝的话应该可以进一步优化执行效率,有兴趣的读者可以后续自行尝试一下。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minAbsoluteSumDiff(self, nums1: List[int], nums2: List[int]) -> int:
        MOD = 10**9+7
        s = sum(abs(x-y) for x, y in zip(nums1, nums2))
        arr = sorted(nums1)
        n = len(nums1)
        res = s
        for x, y in zip(nums1, nums2):
            idx = bisect.bisect_left(arr, y)
            if idx < n:
                res = min(res, s-abs(x-y)+abs(arr[idx]-y))
            if idx - 1 >= 0:
                res = min(res, s-abs(x-y)+abs(arr[idx-1]-y))
        return res % MOD

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

4. 题目四

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

1. 解题思路

这一题坦率地说就是没啥思路,后来是看了答案之后搞明白的,然后感觉真的是三观尽毁……

因为怎么想都觉得他的解法的算法复杂度高的离谱好不好……

他的思路异常简单,就是由于每一个数都不会大于 2 × 1 0 5 2\times10^5 2×105,那么我就考察其中的每一个数 k k k,如果这个数的倍数中存在多个数在给定的数组当中,那么他们的最大公因数必然是 k k k的倍数,然后我们考察所有这样的数,如果到了某一次他们的最大公因数退化到了 k k k,那么就存在某一个子数组使其的最大公因数为 k k k,答案即可加一。

遍历 1 1 1 2 × 1 0 5 2\times10^5 2×105中的所有数,即可得到我们的答案。

怎么想都觉得这玩意的时间复杂度简直爆炸,但是没想到居然能过,没天理啊……

2. 代码实现

给出python代码实现如下:

class Solution:
    def countDifferentSubsequenceGCDs(self, nums: List[int]) -> int:
        _max = 2*10**5
        nums = set(nums)
        
        res = 0
        for i in range(1, _max+1):
            g = 0
            for j in range(i, _max+1, i):
                if j in nums:
                    g = math.gcd(g, j)
                    if g == i:
                        res += 1
                        break
        return res

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

当前最优的代码实现耗时3176ms,但是看了一下思路是基本一致的,三观尽毁……

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值