搜索推荐系统
难度:
标签:
题目描述
代码结果
运行时间: 40 ms, 内存: 18.9 MB
/*
思路:
1. 使用Java Stream对产品列表进行字典序排序。
2. 对搜索词的每个前缀,使用Stream过滤并获取前三个匹配的产品。
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Solution {
public List<List<String>> suggestedProducts(String[] products, String searchWord) {
Arrays.sort(products);
List<List<String>> result = new ArrayList<>();
for (int i = 0; i < searchWord.length(); i++) {
String prefix = searchWord.substring(0, i + 1);
List<String> suggestions = Arrays.stream(products)
.filter(product -> product.startsWith(prefix))
.limit(3)
.collect(Collectors.toList());
result.add(suggestions);
}
return result;
}
}
解释
方法:
该题解采用最小堆的方法来维护字典序的顺序,首先将所有的产品放入最小堆中。然后,对于搜索词的每个字符,它会遍历最小堆,检查堆顶元素的前缀是否与搜索词的当前前缀匹配。如果匹配,且已经选出的推荐产品少于3个,它将该产品加入临时列表并从堆中弹出。如果不匹配或已达到三个推荐产品的限制,它将停止当前字符的检查。在每个字符的推荐完成后,它将临时列表中的产品重新压入堆中以供下一轮使用。
时间复杂度:
O(k n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么选择最小堆来处理产品数组而不是直接对数组进行排序?
▷🦆
在算法中,如果堆顶的产品不符合搜索条件时直接弹出,这是否意味着这些产品在后续的检索中将不再被考虑?这样做是否可能漏掉某些符合条件的产品?
▷🦆
题解中提到,每次循环结束后会将临时列表中的产品重新压入堆中,这样做是否会导致重复的检查并影响效率?
▷🦆
当searchWord的长度大于products中某个产品的长度时,算法如何处理这种情况?
▷