题目描述
小J正在帮助她的朋友们建立一个搜索引擎。为了让用户更快地找到他们感兴趣的帖子,小J决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,ID按从小到大的顺序排列。例如,单词“夏天”可能出现在帖子1、帖子3和帖子7中,那么这个单词的倒排结果是 [1, 3, 7]。如果用户想同时找到包含“夏天”和“海滩”的帖子,小J需要找到两个倒排链的交集,且将结果按从大到小的顺序输出。
现在题目给定两个单词的倒排链数组 a 和 b,请帮助小J找到同时包含这两个单词的帖子ID,并按从大到小的顺序返回结果。
题目拆解
- 理解倒排索引:倒排索引是一种快速检索文本内容的数据结构。它会记录每个单词在哪些文档中出现,并把这些文档的ID按顺序存储。这里,数组
a和b就是两个单词的倒排索引结果。 - 交集操作:用户想查找同时包含两个单词的帖子,因此我们需要找到
a和b的交集,即同时在两个数组中出现的帖子ID。 - 按降序排列结果:找到交集后,题目要求我们将结果按从大到小的顺序输出。
示例讲解
示例1
- 输入:
a = [1, 2, 3, 7],b = [2, 5, 7] - 交集:
[2, 7] - 输出结果:
[7, 2](按降序排序)
示例2
- 输入:
a = [1, 4, 8, 10],b = [2, 4, 8, 10] - 交集:
[4, 8, 10] - 输出结果:
[10, 8, 4](按降序排序)
示例3
- 输入:
a = [3, 5, 9],b = [1, 4, 6] - 交集:
[] - 输出结果:
[](没有共同的帖子ID)
示例4
- 输入:
a = [1, 2, 3],b = [1, 2, 3] - 交集:
[1, 2, 3] - 输出结果:
[3, 2, 1](按降序排序)
解决方案思路
- 转换为集合:将数组
b转换为集合,这样可以快速判断某个元素是否在b中。 - 查找交集:遍历数组
a,只保留同时出现在a和b中的元素。 - 排序输出:将找到的交集按从大到小的顺序排列,形成最终结果。
代码实现
以下是代码实现的详细解释:
python
复制代码
def solution(a, b):
# 将数组 b 转换为集合 set_b,用于快速查找
set_b = set(b)
# 列表推导式筛选出同时在 a 和 b 中的元素
result = [x for x in a if x in set_b]
# 按从大到小排序输出
return sorted(result, reverse=True)
代码详细解读
set_b = set(b): 将b转换成集合set_b。这样做是为了加快查找速度,使我们可以在常数时间内判断一个元素是否存在于b中。result = [x for x in a if x in set_b]: 这是一个列表推导式,它会遍历数组a中的所有元素。如果一个元素在set_b中,也就是同时在a和b中,那么就将这个元素添加到结果列表result中。return sorted(result, reverse=True): 将result按降序排列并返回。sorted函数带有参数reverse=True,表示按照从大到小的顺序排序。
时间复杂度分析
- 转换为集合的时间:将
b转换为集合的时间复杂度是 O(m)O(m)O(m),其中 mmm 是数组b的长度。 - 查找交集的时间:遍历数组
a并查找交集的时间复杂度是 O(n)O(n)O(n),其中 nnn 是数组a的长度。 - 排序的时间:对结果列表
result排序的时间复杂度是 O(klogk)O(k \log k)O(klogk),其中 kkk 是交集的元素数量。
因此,该算法的总时间复杂度为 O(n+m+klogk)O(n + m + k \log k)O(n+m+klogk),能够高效地处理较大的输入。