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

36 阅读3分钟

题目解析

问题描述

小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。现在,给定两个单词的倒排链数组 ab,需要找出同时包含这两个单词的帖子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]

思路

  1. 理解问题:我们需要找到两个倒排链数组 ab 的交集,并按从大到小的顺序返回结果。
  2. 双指针法
    • 使用两个指针分别指向数组 ab 的末尾。
    • 比较两个指针所指的元素:
      • 如果相等,将该元素加入结果列表,并移动两个指针。
      • 如果 a 的元素大于 b 的元素,移动 a 的指针。
      • 如果 a 的元素小于 b 的元素,移动 b 的指针。
  3. 逆序返回结果:由于我们在遍历时已经按从大到小的顺序收集结果,最终结果已经是逆序的。

代码详解

def solution(a, b):
    # 初始化指针
    i, j = len(a) - 1, len(b) - 1
    result = []
    
    # 使用双指针法找到交集
    while i >= 0 and j >= 0:
        if a[i] == b[j]:
            result.append(a[i])
            i -= 1
            j -= 1
        elif a[i] > b[j]:
            i -= 1
        else:
            j -= 1
    
    return result

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

知识总结

新知识点

  1. 双指针法
    • 双指针法是一种常用的算法技巧,特别适用于两个有序数组的交集问题。
    • 通过两个指针分别遍历两个数组,可以高效地找到交集。
  2. 逆序返回结果
    • 在遍历过程中,如果需要按从大到小的顺序返回结果,可以直接在收集结果时按逆序添加。

自己的理解

  • 双指针法:通过双指针法,我们可以高效地找到两个有序数组的交集,避免了嵌套循环带来的高时间复杂度。
  • 逆序返回结果:在遍历时直接按逆序收集结果,可以简化最终的结果处理。

学习建议

  • 多练习双指针法:双指针法是解决有序数组问题的有效方法,通过练习可以熟练掌握其用法。
  • 理解逆序处理:在处理需要逆序返回结果的问题时,可以通过在遍历时直接按逆序添加结果,简化代码逻辑。

豆包Marscode体验

豆包MarsCode提供的思路首先明确了问题的核心:找出两个有序数组 ab 的交集,并将结果按从大到小的顺序返回,并建议使用双指针法来高效地找到交集。双指针法可以充分利用数组已经排序的特点,避免了嵌套循环带来的高时间复杂度。