返回

LeetCode 周赛 363 精彩回顾:二分答案与质因数分解完美结合

闲谈

LeetCode 周赛 363 回顾:技巧、解题思路和常见问题解答

T1. 计算 K 置位下标对应元素的和

在 LeetCode 周赛 363 的第一题中,我们遇到了一个看似简单的任务:计算一个数组中,所有 K 置位下标对应的元素的和。K 置位下标是指二进制表示中第 K 位为 1 的下标。

乍一看,这道题可能需要遍历数组并检查每个元素的 K 置位,但这会很慢。取而代之的是,我们可以使用位运算来快速有效地解决它。

解题思路:

  1. 将 K 转换为二进制。
  2. 对数组中的每个元素执行按位与运算。
  3. 如果结果不为 0,则说明元素的 K 置位为 1。
  4. 将所有满足条件的元素求和,得到最终结果。

T2. 让所有学生保持开心的分组方法数

LeetCode 周赛 363 的第二题考察了我们的贪心算法和计数排序技能。题目要求我们在给定条件下,计算有多少种分组方法可以使所有学生都保持开心。

解题思路:

  1. 将学生按开心程度排序。
  2. 从开心程度最高的学生开始分组。
  3. 如果组内学生数不超过最大组数,且开心程度差值不超过最大差值,则将学生分配到该组。
  4. 否则,创建一个新组。

通过这种贪心策略,我们可以保证所有学生都开心,并最大程度地增加分组方法的数量。

代码示例:

def count_happy_groups(students, max_group_size, max_diff):
    # 排序学生
    students.sort(key=lambda s: s.happiness, reverse=True)

    # 初始化分组
    groups = []

    # 遍历学生
    for student in students:
        # 检查是否可以添加到现有组
        for group in groups:
            if len(group) < max_group_size and abs(student.happiness - group[-1].happiness) <= max_diff:
                group.append(student)
                break
        # 如果不能添加到现有组,创建一个新组
        else:
            groups.append([student])

    # 返回分组方法数
    return len(groups)

T3. 最大合金数

LeetCode 周赛 363 的压轴题是一道 Hard 难度的题目,要求我们从两个数组中分别选取一个数字,然后将这两个数字拼接起来,组成一个最大的合金数。合金数是指由不同数字组成的数字,并且这些数字按照从大到小的顺序排列。

解题思路:

  1. 将两个数组中的每个数字分解成质因数。
  2. 将质因数按从大到小的顺序排序。
  3. 将两个排序的质因数列表拼接起来,组成最大的合金数。

代码示例:

def max_alloy_number(arr1, arr2):
    # 分解质因数
    factors1 = []
    for num in arr1:
        factors1 += prime_factors(num)
    
    factors2 = []
    for num in arr2:
        factors2 += prime_factors(num)
    
    # 排序质因数
    factors1.sort(reverse=True)
    factors2.sort(reverse=True)
    
    # 拼接质因数
    return ''.join([str(factor) for factor in factors1 + factors2])

def prime_factors(num):
    factors = []
    divisor = 2
    while num > 1:
        if num % divisor == 0:
            factors.append(divisor)
            num //= divisor
        else:
            divisor += 1
    return factors

总结

LeetCode 周赛 363 的三道题目涵盖了二分答案、位运算、贪心、排序、计数排序、质因数分解等多种高级技巧。通过这三道题目的练习,相信大家对这些技巧有了更深刻的理解,也为未来的比赛积累了更多经验。

希望大家在接下来的 LeetCode 周赛中继续加油,取得更好的成绩!

常见问题解答

Q1. K 置位下标对应元素的和如何快速计算?
A1. 使用位运算,可以将二进制表示中的 K 置位转换为 1,然后与数组元素进行按位与运算。

Q2. 如何找出有多少种分组方法可以使所有学生保持开心?
A2. 贪心算法可以帮助我们找到一种分组方法,使得所有学生都开心。首先将学生按照开心程度排序,然后从开心程度最高的学生开始分组。

Q3. 什么是合金数?如何构建最大的合金数?
A3. 合金数是由不同数字组成的数字,并且这些数字按照从大到小的顺序排列。要构建最大的合金数,可以将两个数组中的每个数字分解成质因数,然后将质因数按照从大到小的顺序排序并拼接起来。

Q4. 如何分解一个数字的质因数?
A4. 可以使用试除法来分解一个数字的质因数。从 2 开始,逐一检查数字是否可以被当前质数整除,直到找到所有质因数。

Q5. 如何避免在 LeetCode 周赛中犯常见的错误?
A5. 注意边界条件、小心类型转换、使用调试工具、善于提问和寻求帮助。