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

118 阅读3分钟

1.小S的倒排索引

问题描述

小s正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小s决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子1D的列表,这些帖子包含该单词,且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]

2.解题思路

要解决这个问题,我们需要找到两个数组的交集,并将结果按从大到小的顺序返回。我们可以使用以下步骤:

  1. 排序:首先,我们需要对两个数组进行排序。这样我们可以更高效地找到它们的交集。
  2. 双指针:使用两个指针分别遍历两个数组。如果两个指针指向的元素相等,那么这个元素就是交集的一部分。我们将这个元素添加到结果数组中,并将两个指针都向前移动。如果一个指针指向的元素小于另一个,那么将较小元素的指针向前移动。
  3. 排序结果:找到交集后,我们需要将结果数组按从大到小的顺序排序。

3.代码实现

public class Main {
    public static List<Integer> solution(List<Integer> a, List<Integer> b) {
        // 使用 HashSet 来存储 b 的元素,以便快速查找
        Set<Integer> setB = new HashSet<>(b);
        List<Integer> result = new ArrayList<>();

        // 遍历 a,找到同时在 b 中的元素
        for (Integer num : a) {
            if (setB.contains(num)) {
                result.add(num);
            }
        }

        // 按从大到小排序
        Collections.sort(result, Collections.reverseOrder());
        return result;
    }

    public static void main(String[] args) {
        System.out.println(solution(Arrays.asList(1, 2, 3, 7), Arrays.asList(2, 5, 7)).equals(Arrays.asList(7, 2))); // 输出: true
        System.out.println(solution(Arrays.asList(1, 4, 8, 10), Arrays.asList(2, 4, 8, 10)).equals(Arrays.asList(10, 8, 4))); // 输出: true
        System.out.println(solution(Arrays.asList(3, 5, 9), Arrays.asList(1, 4, 6)).equals(Collections.emptyList())); // 输出: true
        System.out.println(solution(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3)).equals(Arrays.asList(3, 2, 1))); // 输出: true
    }
}

4.复杂度分析

  1. 排序:对两个数组进行排序的时间复杂度是 O(nlog⁡n)O(nlogn),其中 nn 是数组的长度。
  2. 双指针:双指针遍历的时间复杂度是 O(n)O(n),其中 nn 是两个数组中较长数组的长度。
  3. 排序结果:对结果数组进行排序的时间复杂度是 O(klog⁡k)O(klogk),其中 kk 是交集的大小。

因此,总的时间复杂度是 O(nlog⁡n+n+klog⁡k)O(nlogn+n+klogk),其中 nn 是两个数组中较长数组的长度,kk 是交集的大小。在最坏的情况下,kk 可以等于 nn,所以时间复杂度可以简化为 O(nlog⁡n)O(nlogn)。

空间复杂度是 O(k)O(k),因为我们需要存储交集的结果。