LeetCode笔记:Biweekly Contest 104

本文是关于LeetCodeBiweeklyContest104的解题笔记,详细介绍了四道题目的解题思路和Python代码实现,包括统计老年人数量、矩阵元素之和、最大位或运算和英雄力量的总和问题。

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

1. 题目一

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

1. 解题思路

这一题就是翻译一下题目,从给定的id当中提取出年龄信息然后统计一下即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countSeniors(self, details: List[str]) -> int:
        cnt = 0
        for p in details:
            age = int(p[11:13])
            if age > 60:
                cnt += 1
        return cnt

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

2. 题目二

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

1. 解题思路

这一题同样思路也挺直接的,就是先对每一行进行排序,然后每次删除都会删除同一列的元素了。因此,我们只需要对每一列的元素找出最大值然后进行求和即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def matrixSum(self, nums: List[List[int]]) -> int:
        n, m = len(nums), len(nums[0])
        nums = [sorted(line) for line in nums]
        return sum(max(nums[i][j] for i in range(n)) for j in range(m))

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

3. 题目三

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

1. 解题思路

很惭愧,这道题我没能想到思路,最后是看了大佬们的解答之后想明白的思路。

其实核心点就是注意到:

  • 要获得最大的返回结果,那么必然是对其中某一个数连续进行k次乘2的操作。

因此,关键问题就是怎么找到这个目标值,一个简单的方式就是遍历一下,但是这样也就要求快速求得其他所有数的位或结果,而这个方式可以通过记录一下两个值进行考察:

  • single: 直接的位或结果
  • double: 只有当同一位上有至少两个数都为1才保留这一位上的值为1

此时,我们就可以快速得到任意一个值之外的所有结果的位或结果如下了:

s = double | (single & (~x))

综上,命题即可求解。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumOr(self, nums: List[int], k: int) -> int:
        single = 0
        double = 0
        for x in nums:
            double = double | (single & x)
            single = single | x
            
        res = 0
        for x in nums:
            s = single & (~x)
            s = s | double
            res = max(res, s | (x << k))
        return res

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

4. 题目四

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

1. 解题思路

这一题其实就是找规律。

我们首先将所有的元素顺序排列,然后考察每一个元素作为最大值的情况,此时,不难发现:

  • 此时满足条件的所有的子集恰为它自身加上之前所有出现过的子集以及空集的情况。

因此,我们不难基于此写出迭代方法如下。

2. 代码实现

给出python代码实现如下:

class Solution:
    def sumOfPower(self, nums: List[int]) -> int:
        MOD = 10**9 + 7
        
        nums = sorted(nums)
        s, tot = 0, 0
        res = 0
        for i, x in enumerate(nums):
            s = tot + x
            res = (res + s * x**2) % MOD
            tot = (tot + s) % MOD
        return res

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值