青训营X豆包MarsCode 技术训练营:AI刷题 问题35:小S的倒排索引| 豆包MarsCode AI 刷题

65 阅读2分钟

问题描述

小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。
例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排链就是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小S需要找出两个倒排链的交集,且将结果按照从大到小的顺序输出。现在,给定两个单词的倒排链数组 a 和 b,请你帮助小S找出同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。


测试样例

样例1:

输入:a = [1, 2, 3, 7], b = [2, 5, 7]
输出:[7, 2]

样例2:

输入:a = [1, 4, 8, 10], b = [2, 4, 8, 10]
输出:[10, 8, 4]

样例3:

输入:a = [3, 5, 9], b = [1, 4, 6]
输出:[]

样例4:

输入:a = [1, 2, 3], b = [1, 2, 3]
输出:[3, 2, 1]

问题分析

这个问题要求找到两个倒排链(即帖子ID列表) ab 的交集,并按从大到小的顺序输出结果。可以通过以下步骤来解决:

解题思路:

  1. 交集操作:首先,我们需要找到两个列表的交集。这可以通过遍历两个列表并找到共同的元素来实现。
  2. 倒序排序:找到交集后,我们需要按从大到小的顺序返回这些元素。

步骤:

  • 使用集合(set)来找到两个列表的交集,因为集合可以高效地处理交集操作。
  • 将交集元素按降序排列。
  • 返回结果。

代码实现

def solution(a, b):
    # 计算交集
    common = list(set(a) & set(b))
    # 按照从大到小的顺序排序
    common.sort(reverse=True)
    return common

代码分析

  • set(a) & set(b):利用集合的交集操作来找到两个列表中的共同元素。

  • list(...):将交集结果转换为列表,因为集合是无序的,而我们需要将其转换为列表以便排序。

  • common.sort(reverse=True):将交集结果按照从大到小的顺序排序。

  • 返回排序后的结果。

复杂度分析:

  • 将两个列表转换为集合的时间复杂度是 O(n + m),其中 nm 分别是列表 ab 的长度。
  • 交集操作的时间复杂度是 O(min(n, m)),因为我们只需要遍历较小的集合来找到交集。
  • 排序的时间复杂度是 O(k log k),其中 k 是交集的元素数量,最坏情况下,k 等于 min(n, m)

因此,整体时间复杂度为 O(n + m + k log k)