倒排索引 | 豆包MarsCode AI刷题

99 阅读2分钟

题目回顾

image.png

题目分析

这道题主要考查对数组的操作和交集的求解,同时需要考虑输出结果的顺序。

一、问题核心 问题的核心在于找出两个给定数组的交集,并将交集结果按照从大到小的顺序输出。这涉及到对数组元素的比较和筛选。

二、解题思路

  1. 遍历两个数组 - 可以同时遍历两个输入的数组 ab
    • 比较两个数组中的元素,找到相同的元素。
  2. 确定交集
    • 当发现相同元素时,将其加入到结果集中。
    • 由于输入的数组中帖子 ID 是按从小到大的顺序排列的,在遍历过程中可以利用这个顺序来提高效率。
  3. 输出结果排序 - 最后,将得到的交集结果按照从大到小的顺序进行排序输出。

三、复杂度分析

  1. 时间复杂度:
    • 假设数组 a 的长度为 m,数组 b 的长度为 n。在最坏的情况下,需要遍历两个数组的所有元素,时间复杂度为 O(m+n)O(m+n)
  2. 空间复杂度:
    • 取决于交集的大小,在最坏的情况下,交集的大小为较小数组的长度,空间复杂度为 O(min(m,n))O(min(m,n))

代码实现:

def solution(a, b):
    # 将列表转换为集合,找到交集
    set_a = set(a)
    set_b = set(b)
    intersection = set_a.intersection(set_b)
    
    # 将交集转换为列表,并按照从大到小的顺序排序
    sorted_intersection = sorted(list(intersection), reverse=True)
    
    return sorted_intersection

if __name__ == '__main__':
    print(solution([1, 2, 3, 7], [2, 5, 7]) == [7, 2])
    print(solution([1, 4, 8, 10], [2, 4, 8, 10]) == [10, 8, 4])
    print(solution([3, 5, 9], [1, 4, 6]) == [])
    print(solution([1, 2, 3], [1, 2, 3]) == [3, 2, 1])

代码实现细节

计算交集:

  • 首先,通过 set(a) 和 set(b) 将输入的列表 a 和 b 分别转换为集合 set_a 和 set_b。集合的特点是元素具有唯一性,这样做可以方便地去除列表中可能存在的重复元素,以便准确地找到两个列表的交集。
  • 然后,使用 set_a.intersection(set_b) 方法来获取两个集合的交集,得到的结果存储在变量 intersection 中。这个交集就是两个列表中共同出现的元素所组成的集合。

处理交集并排序:

  • 接下来,由于最终需要返回一个按照从大到小顺序排列的列表,所以先将交集集合 intersection 通过 list(intersection) 转换为列表形式。这一步是因为集合是无序的,而我们要进行排序操作需要基于列表。
  • 再使用 sorted(list(intersection), reverse=True) 对转换后的列表进行排序操作。这里的 sorted 函数会返回一个新的已排序的列表,参数 reverse=True 表示按照从大到小的顺序进行排序,排序后的结果存储在变量 sorted_intersection 中。