第499题 雇主招聘问题
题目分析
小U作为雇主希望找到一个薪资要求最低且不与其他人重复的候选人。如果所有候选人的薪资要求都有重复,则不录用任何人。我们需要从给定的薪资列表中,找出唯一且最低的薪资。
输入:
n: 候选人数。salaries: 包含每个候选人期望薪资的列表。
输出:
- 返回符合条件的最低薪资,若没有则返回 -1。
解题思路
-
统计薪资出现次数:我们需要找出每个薪资在列表中出现的次数,以识别哪些薪资是唯一的。
-
筛选唯一薪资:从统计结果中提取出只出现一次的薪资。
-
求最小值:如果存在唯一薪资,找出其中的最小值;如果不存在,则返回 -1。
通过这样的思路,我们可以确保正确模拟比赛的过程并找到最终的赢家。
解题代码
from collections import Counter
def solution(n: int, salaries: list) -> int:
# 统计每个薪资的出现次数
salary_count = Counter(salaries)
# 初始化最小唯一薪资为一个较大数值
min_unique_salary = float('inf')
# 找出出现次数为1且值最小的薪资
for salary, count in salary_count.items():
if count == 1 and salary < min_unique_salary:
min_unique_salary = salary
# 如果 min_unique_salary 没有被更新,说明没有符合条件的薪资
return min_unique_salary if min_unique_salary != float('inf') else -1
if __name__ == '__main__':
print(solution(n = 3, salaries = [3, 2, 1]) == 1)
print(solution(n = 6, salaries = [1, 1, 4, 5, 1, 4]) == 5)
print(solution(n = 3, salaries = [4, 4, 4]) == -1)
模块解释
-
collections.Counter:这个模块提供了一种快速且简单的方法来计数元素的出现次数。在这里,我们使用它来统计每个薪资的出现频率。 -
列表推导式:
unique_salaries = [salary for salary, count in salary_counts.items() if count == 1]用于从字典中筛选出只出现一次的薪资,简洁而高效。 -
min():用于返回列表中的最小值。
结论
通过使用 Counter 模块来统计薪资的频率,并结合列表推导式筛选出唯一的薪资,最终能够高效地找到符合条件的最低薪资。如果没有这样的薪资,返回 -1。这个解法时间复杂度为 O(n),空间复杂度也为 O(n),对于大多数实际应用场景都是有效的。