35 小S的倒排索引 | 豆包MarsCode AI刷题

42 阅读3分钟

问题描述

小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]

解题思路

  • 初始化两个指针,分别指向两个数组的起始位置。

  • 比较两个指针所指的元素:

    • 如果元素相等,则将该元素加入结果列表,并将两个指针都向前移动。
    • 如果元素不相等,则将指向较小元素的指针向前移动。
  • 重复上述步骤,直到其中一个指针超出数组的范围。

  • 最后,反转结果列表以满足从大到小的顺序要求。

代码实现

def solution(a, b):
    i, j = 0, 0
    result = []

    while i < len(a) and j < len(b):
        if a[i] == b[j]:
            result.append(a[i])
            i += 1
            j += 1
        elif a[i] < b[j]:
            i += 1
        else:
            j += 1
    result.reverse()
    return result

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])
    

知识总结

双指针法

  • 双指针法是一种常用的算法技巧,通常用于在有序数组或链表中查找或处理数据。
  • 在这个问题中,我们使用双指针法来遍历两个有序数组,找出它们的交集。
  • 双指针法的时间复杂度通常为 O(n + m),其中 n 和 m 分别是两个数组的长度,因此非常高效。

其他双指针应用

  • 两数之和:在一个有序数组中,找到两个数使得它们的和等于目标值。
  • 三数之和:在一个数组中,找到所有不重复的三元组,使得它们的和为零。
  • 链表操作:在链表中查找特定节点或进行合并操作。

数组操作

  • 遍历:通过指针遍历数组,比较元素并移动指针。
  • 插入:将符合条件的元素插入结果列表。
  • 反转:在找到交集后,反转结果列表以满足从大到小的顺序要求。
  • 排序:对数组进行排序,可以使用内置的排序函数sort()或自定义排序算法。
  • 查找:在数组中查找特定元素,可以使用二分查找等高效算法。
  • 合并:合并两个有序数组,可以使用双指针法或归并排序的思想。