刷题部分题解思路| 豆包MarsCode AI刷题

118 阅读3分钟

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的得分挑战

思路解析

  1. 排序数组: 为了方便配对,我们首先将数组 a 按升序排序。这有助于我们更容易地找到符合条件的配对。

  2. 定义DP数组: 定义一个 DP 数组 dp,其中 dp[i] 表示前 i 个元素能够获得的最大分数。

  3. 状态转移: 对于每一个位置 i,有两种选择:

    • 不配对第 i 个元素:则 dp[i] = dp[i-1]
    • 配对第 i 个元素与第 i-1 个元素(如果它们的差值不超过 k):则 dp[i] = dp[i-2] + a[i-1] * a[i-2]

    我们取这两种选择中的最大值作为 dp[i] 的值。

  4. 边界条件

    • dp[0] = 0:没有元素时,分数为0。
    • dp[1] = 0:只有一个元素时,无法配对,分数为0。
  5. 最终结果: 最终的最大分数为 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)