力扣随机一题 哈希表 排序 数组

简介: 力扣随机一题 哈希表 排序 数组

2491.划分技能点相等的团队【中等

题目:

给你一个正整数数组 skill ,数组长度为 偶数 n ,其中 skill[i] 表示第 i 个玩家的技能点。将所有玩家分成 n / 22 人团队,使每一个团队的技能点之和 相等

团队的 化学反应 等于团队中玩家的技能点 乘积

返回所有团队的 化学反应 之和,如果无法使每个团队的技能点之和相等,则返回 -1

示例 1:

输入:skill = [3,2,5,1,3,4]

输出:22

解释:

将玩家分成 3 个团队 (1, 5), (2, 4), (3, 3) ,每个团队的技能点之和都是 6 。

所有团队的化学反应之和是 1 * 5 + 2 * 4 + 3 * 3 = 5 + 8 + 9 = 22 。


示例 2:

输入:skill = [3,4]

输出:12

解释:

两个玩家形成一个团队,技能点之和是 7 。

团队的化学反应是 3 * 4 = 12 。


示例 3:

输入:skill = [1,1,2,3]

输出:-1

解释:

无法将玩家分成每个团队技能点都相等的若干个 2 人团队。

分析问题:

思路1:

       这里可以先根据数组的长度来获得平均和key值,然后对skill数组进行一个排序,那么如果想等于key值的话,只能让最大值+最小值,如果有一个不符合题意则直接return -1。将符合题意的两个值的乘积全部加起来,最后return 就是结果。思路很简单。但是时间复杂度相比之下略高。

思路2:

       首先计算出所有技能值的总和以及每个团队理想的技能值总和。然后通过遍历技能值及其出现次数,判断能否将技能值两两分组,使得每组的技能值总和都等于理想值,同时计算出所有分组产生的化学效能总和。如果在过程中出现无法满足分组条件的情况,就返回 -1 ,否则返回计算得到的化学效能总和。


代码实现:

思路1代码实现:
class Solution:
    def dividePlayers(self, skill: List[int]) -> int:
        skill.sort()
        ans, s = 0, skill[0] + skill[-1]
        for i in range(len(skill) // 2):
            x, y = skill[i], skill[-1 - i]
            if x + y != s: return -1
            ans += x * y
        return ans


 

思路2代码实现:
class Solution:
    def dividePlayers(self, skill: List[int]) -> int:
        # 计算所有技能值的总和
        s = sum(skill)
        # 计算团队数量(因为要两两分组,所以团队数量是技能值个数的一半)
        n = len(skill) // 2
        # 如果总和不能被团队数量整除,说明无法平均分配,返回 -1
        if s % n:
            return -1
        # 计算每个团队的理想技能值总和
        t = s // n
        # 初始化最终的化学效能总和为 0
        ans = 0
        # 使用 Counter 统计每个技能值出现的次数
        cnt = Counter(skill)
        # 遍历统计得到的技能值
        for k in list(cnt.keys()):
            # 如果当前技能值 k 与理想值 t - k 相等
            if k == t - k:
                # 如果该技能值的出现次数为奇数,无法两两配对,返回 -1
                if cnt[k] % 2:
                    return -1
                # 计算该技能值两两配对产生的化学效能,并累加到总和中
                ans += k*k*cnt[k]//2
            else:
                # 如果当前技能值 k 和 t - k 的出现次数相等
                if cnt[k] == cnt[t - k]:
                    # 计算它们配对产生的化学效能,并累加到总和中
                    ans += k*(t - k)*cnt[k]
                    # 将这两个技能值的出现次数置为 0,表示已经处理完
                    cnt[k] = cnt[t - k] = 0
                else:
                    # 如果出现次数不相等,无法满足两两配对的条件,返回 -1
                    return -1
        # 返回最终的化学效能总和
        return ans


 

总结:

        两种方法,思路1较容易想出来但是复杂度略高。思路2相比于思路1可能没那么容易想出来,但是复杂度还是很优的。下面对思路2进行代码详解:

思路2代码详解:

       首先,通过计算技能值的总和以及团队数量,来判断是否能够平均分配技能值。如果不能整除,说明无法实现平均分组,直接返回 -1

       然后,创建一个计数器 cnt 来统计每个技能值出现的次数。

       接下来,遍历所有的技能值。对于每个技能值 k ,分两种情况处理:

  1. 如果 k 与理想差值 t - k 相等,需要检查其出现次数是否为偶数,因为只有偶数次才能两两配对。如果是偶数次,计算 k 两两配对产生的化学效能并累加到结果中。
  2. 如果 k 与理想差值 t - k 不相等,那么需要检查 kt - k 的出现次数是否相等,如果相等则计算它们配对产生的化学效能,否则说明无法满足两两配对的条件,直接返回 -1

       最后,如果整个遍历过程都没有出现无法配对的情况,就返回计算得到的化学效能总和。

考点
  1. 数学计算,如求和、整除判断。
  2. 数据结构 Counter 的使用。
  3. 条件判断和逻辑处理。
收获
  1. 学习如何有效地处理整数列表的分组问题,包括总和计算、平均分配判断等。
  2. 掌握使用 Counter 来高效统计元素出现次数的方法。
  3. 提升通过遍历和条件判断来解决复杂逻辑问题的能力。
  4. 了解如何在代码中确保数据满足特定条件,不满足时进行错误处理返回特定值。

“无聊的并不是时间,而是平庸无奇的我。”——《樱花庄的宠物女孩》

目录
相关文章
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
26 4
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
26 0
Leetcode第三十三题(搜索旋转排序数组)
|
2月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
76 0
|
2月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
23 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
64 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
128 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
50 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
76 7