498雇主招聘问题
使用字典来记录每个薪资的出现次数。完成统计后,我们会生成一个列表,这个列表中只包含那些出现次数为 1 的薪资。如果不为空,我们就返回其中的最小值;如果为空,则返回 -1,表示没有符合条件的人选。
def solution(n: int, salaries: list) -> int:
t = {}
for i in salaries:
if i in t:
t[i] += 1
else:
t[i] = 1
tt =[i for i, cnt in t.items() if cnt == 1]
if tt:
return min(tt)
else:
return -1
196 小M的得分挑战
思路解析
-
排序数组: 为了方便配对,我们首先将数组
a按升序排序。这有助于我们更容易地找到符合条件的配对。 -
定义DP数组: 定义一个 DP 数组
dp,其中dp[i]表示前i个元素能够获得的最大分数。 -
状态转移: 对于每一个位置
i,有两种选择:- 不配对第
i个元素:则dp[i] = dp[i-1]。 - 配对第
i个元素与第i-1个元素(如果它们的差值不超过k):则dp[i] = dp[i-2] + a[i-1] * a[i-2]。
我们取这两种选择中的最大值作为
dp[i]的值。 - 不配对第
-
边界条件:
dp[0] = 0:没有元素时,分数为0。dp[1] = 0:只有一个元素时,无法配对,分数为0。
-
最终结果: 最终的最大分数为
dp[n]。
def solution(n: int, k: int, a: list) -> int:
# 将数组按升序排序
a_sorted = sorted(a)
# 初始化DP数组,长度为n+1
dp = [0] * (n + 1)
for i in range(2, n + 1):
# 不配对当前元素
dp[i] = dp[i - 1]
# 尝试配对当前元素与前一个元素
if a_sorted[i - 1] - a_sorted[i - 2] <= k:
dp[i] = max(dp[i], dp[i - 2] + a_sorted[i - 1] * a_sorted[i - 2])
return dp[n]
154小C点菜问题
1. 过滤超出预算的菜品
- 菜单中的菜品中,单价超过
m的菜不能被点,因此我们首先要过滤掉这些菜。 - 过滤后的列表只保留价格小于等于
m的菜。
2. 统计每个价格的菜品数量
- 剩下的菜品中,我们需要统计每个价格出现的次数。
- 例如,价格列表
[2, 3, 3, 6, 6, 6]中,价格 3 出现 2 次,价格 6 出现 3 次。 - 可以使用 Python 的
collections.Counter快速统计这些频次。
3. 寻找最大数量
- 我们只需要从统计结果中找到最大出现次数,即频率最高的价格。
- 例如,如果统计结果是
{6: 3, 3: 2, 2: 1},那么答案是3,因为价格 6 出现了最多次。
4. 特殊情况处理
- 如果过滤后的列表为空(即所有菜品的价格都超过
m),小C无法点菜,答案是0。
from collections import Counter
def solution(m: int, w: list) -> int:
filtered_w = [price for price in w if price <= m]
if not filtered_w:
return 0
price_counts = Counter(filtered_w)
return max(price_counts.values())
100统计班级中的说谎者
-
排序成绩列表:将所有学生的成绩按从小到大排序,方便后续计算。
-
预处理:使用二分查找(
bisect模块)快速找到每个学生的得分在排序列表中的位置。 -
计算 n_gt:对于每个学生,计算得分高于他的学生人数。
-
判断是否说谎:如果 n_gt×2<Nn_gt \times 2 < Nn_gt×2<N,则该学生会说谎。
-
统计总人数:累计满足条件的学生人数。
def solution(A):
N = len(A)
sorted_A = sorted(A)
from bisect import bisect_right
lie_count = 0
for score in A:
# 得分高于该学生的学生人数
n_gt = N - bisect_right(sorted_A, score)
# 判断是否会说谎
if n_gt * 2 < N:
lie_count +=1
return lie_count
if __name__ == "__main__":
print(solution([100, 100, 100]) == 3)
print(solution([2, 1, 3]) == 2)
print(solution([30, 1, 30, 30]) == 3)
print(solution([19, 27, 73, 55, 88]) == 3)
print(solution([19, 27, 73, 55, 88, 88, 2, 17, 22]) == 5)