力扣 搜索推荐系统

Leetcode 1268:搜索推荐系统(超详细的解法!!!) 给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。 请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。 请你以二维列表的形式,返回在输入 searchWord ... 阅读详情

前言

问题链接

描述

给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。

请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。

请你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。

输入:products = ["mobile","mouse","moneypot","monitor","mousepad"], searchWord = "mouse"
输出:[
["mobile","moneypot","monitor"],
["mobile","moneypot","monitor"],
["mouse","mousepad"],
["mouse","mousepad"],
["mouse","mousepad"]
]
解释:按字典序排序后的产品列表是 ["mobile","moneypot","monitor","mouse","mousepad"]
输入 m 和 mo,由于所有产品的前缀都相同,所以系统返回字典序最小的三个产品 ["mobile","moneypot","monitor"]
输入 mou, mous 和 mouse 后系统都返回 ["mouse","mousepad"]

分析

大部分App都会有搜索功能,所以这个题目是有商业价值的,当然实际的推荐系统会比这个复杂很多。
看一个最高赞的解法,然后分析他的代码。

解法

public List<List<String>> suggestedProducts(String[] products, String searchWord) {
        List<List<String>> res = new ArrayList<>();
        TreeMap<String, Integer> map = new TreeMap<>();
        Arrays.sort(products);
        List<String> productsList = Arrays.asList(products);

        for (int i = 0; i < products.length; i++) {
            map.put(products[i], i);
        }

        String key = "";
        for (char c : searchWord.toCharArray()) {
            key += c;
            String ceiling = map.ceilingKey(key);
            String floor = map.floorKey(key + "~");
            if (ceiling == null || floor == null) break;
            res.add(productsList.subList(map.get(ceiling), Math.min(map.get(ceiling) + 3, map.get(floor) + 1)));
        }

        while (res.size() < searchWord.length()) res.add(new ArrayList<>());
        return res;
    }

完整测试代码

public class SearchSuggestionsSystem {

    public static void main(String[] args) {
        String[] products = {"mobile","mouse","moneypot","monitor","mousepad"};
        String searchWord = "mouse";
        List<List<String>> str = suggestedProducts(products, searchWord);
        while (str.size() > 0) {
            List<String> list = str.remove(0);
            System.out.println(list.toString());
        }
    }

    public static List<List<String>> suggestedProducts(String[] products, String searchWord) {
        List<List<String>> res = new ArrayList<>();
        TreeMap<String, Integer> map = new TreeMap<>();
        Arrays.sort(products);
        List<String> productsList = Arrays.asList(products);

        for (int i = 0; i < products.length; i++) {
            map.put(products[i], i);
        }

        String key = "";
        for (char c : searchWord.toCharArray()) {
            key += c;
            String ceiling = map.ceilingKey(key);
            String floor = map.floorKey(key + "~");
            if (ceiling == null || floor == null) break;
            res.add(productsList.subList(map.get(ceiling), Math.min(map.get(ceiling) + 3, map.get(floor) + 1)));
        }

        while (res.size() < searchWord.length()) res.add(new ArrayList<>());
        return res;
    }
}

输出:

[mobile, moneypot, monitor]
[mobile, moneypot, monitor]
[mouse, mousepad]
[mouse, mousepad]
[mouse, mousepad]

源码解析

public static List<List<String>> suggestedProducts(String[] products, String searchWord) {
        List<List<String>> res = new ArrayList<>();
        //底层数据结构为红黑树的数据结构
        //文章:https://www.jianshu.com/p/2dcff3634326
        TreeMap<String, Integer> map = new TreeMap<>();
        //将所有数据按照自然序列排序  a b c
        Arrays.sort(products);
        List<String> productsList = Arrays.asList(products);

        for (int i = 0; i < products.length; i++) {
            map.put(products[i], i);
        }

        String key = "";
        for (char c : searchWord.toCharArray()) {
            key += c;
            //ceiling : 天花板 返回大于指定的最小键值的条目
            String ceiling = map.ceilingKey(key);
            //floor : 地板  返回小于指定的最大键值的条目
            String floor = map.floorKey(key + "~");
            if (ceiling == null || floor == null) break;
            res.add(productsList.subList(map.get(ceiling), Math.min(map.get(ceiling) + 3, map.get(floor) + 1)));
        }

        //补空指
        while (res.size() < searchWord.length()) res.add(new ArrayList<>());
        return res;
    }

主要是利用了TreeMap的功能,TreeMap提供了获取制定字符匹配出来的最小key和最大key,通过这两个key可以截取出相应的数据。
更多关于TreeMap的详解,可以看这位大神的博客。

总结

很多时候很多很优秀的算法,依我们目前的水平可能想不到,但是我们可以学习优秀的算法,并理解它们,我相信随着时间的积累,我们也会慢慢的优秀起来,fighting!

参考

  1. Java集合–TreeMap完全解析
  2. [C++/Java/Python] Sort and Binary Search the Prefix
leetcode-country-ranking:按国家,用户名查找Leetcode排名 LeetCode排名 搜寻LeetCode全球排名,并建立一个网站来支持按国家和用户名查找LeetCode排名。 入门 由于LeetCode不支持按国家/地区过滤排名,因此我编写了一些Python脚本来检索LeetCode中的全球排名数据。 它有助于搜索,按用户名或国家/地区过滤。 尝试在以下位置找到您所在的国家或地区中的其他人: : 我不太擅长前端Web开发,因此如果您能帮助我进行改进,那将是很好的。 当地发展 如果您想建立自己的网站。 在本地计算机上运行以下步骤: #Step 1: Run docker for the environment docker-compose up - 立即下载

相关推荐

低速信号设计之 ESPI 篇

ESPI 是 Intel 推出的增强型串行外设接口,基于 SPI 发展而来,新增 Reset# 和 Alert# 信号,采用点对点主从通信模型,最高速率达 33MHz,支持半双工与 DMA 传输。 其物理接口含 10 条线路,通信协议分物理层、数据链路层等四层。布局布线需关注信号完整性、电源完整性,还得考虑与 SPI 的兼容性。 ESPI 广泛应用于计算机系统(连接 BIOS、电源管理器等)和工业控制领域,具有引脚少、功耗低等优势,但设计复杂且存在兼容性挑战。

qq_16237389的博客 1379

搜索与推荐系统优化

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考添加链接描述例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

qq_45857607的博客 1281

Kafka 系列 —(17)Kafka 流式处理:Kafka Streams架构、使用场景、框架选择

本文介绍了KafkaStreams的架构特点、应用场景及与其他流处理框架的比较。KafkaStreams作为嵌入式分布式流处理库,其核心架构包含流处理器、任务、拓扑和本地状态存储,具备自动容错和伸缩能力。适用于实时监控、ETL、聚合、Join、物化视图等低延迟场景。与Flink、Spark相比,KafkaStreams适合简单架构和微服务,而Flink适合大规模处理,Spark更适合批处理。选择框架需根据具体场景需求,如微服务推荐KafkaStreams,大规模处理推荐Flink。

moton2017的博客 1631

如何在LeetCode(力扣)加好友关注

LeetCode是一个很好的刷题网站。想当年写个for循环都赠送一个error两个warning。。。。。 LeetCode第一次让我觉得刷题也还蛮有意思的,当然如果能在leetcode里关注一些好友,大家一起比赛做题,快乐翻倍!! 所以怎么加好友关注呢: 让你想关注的好友打开主页 让他把这个网址发个你,在浏览器中点开,就可以加关注啦 另这是博主的主页 https://leetcode-cn.com/u/zhou-yu-zhu/ 欢迎大家互关!! ...

qq_42642008的博客 1万+

文献阅读:SAR像素偏移的性能改进An Improvement of the Performance of SAR Offset Tracking Approach

像素偏移追踪POT文献阅读

weixin_56301271的博客 342

【Codex Sandbox 与审批机制:小白也能看懂的实用教程】

这篇教程介绍了Codex工具中的沙盒(Sandbox)和审批(Approvals)机制,帮助用户安全高效地使用Codex协作。沙盒限制Codex访问范围,审批机制则控制敏感操作权限。文章详细讲解了五种常见模式:最安全的安全只读浏览、只读非交互、仓库内编辑、Auto预设和不推荐的YOLO模式。还提供了新手使用路径建议、配置示例和实战场景范式,包括如何测试沙盒行为、不同系统下的实现方式以及常见问题解答。最后附上速查清单,帮助用户快速选择合适的权限组合。

zsr154278963的博客 6706

力扣-寻找用户推荐人

给定表 customer ,里面保存了所有客户信息和他们的推荐人。写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。

业余Python爱好者 1791

【技术解析】LUT-Fuse:如何通过可学习查找表与蒸馏技术,为边缘设备解锁实时图像融合

本文解析了ICCV 2025提出的LUT-Fuse技术,它通过可学习查找表与知识蒸馏,解决了边缘设备上图像融合的质量、速度与功耗“不可能三角”。该方法将复杂计算预编译为高速查找表,在Jetson等设备上实现100+ FPS的实时红外-可见光图像融合,为无人机、安防等应用提供了高效解决方案。

code8的博客 495

一个简单的推荐系统的实现

我们现在身处的时代是信息大爆炸的时代,每时每刻都有海量的信息产生,对于人类而已,浏览所有的信息去寻找自己想要的信息代价太大,搜索系统和推荐系统应运而生。利用搜索系统,用户可以输入关键词搜索自己想要的信息;而推荐系统则不需要用户输入关键词,自己猜测用户可能对什么东西感兴趣,从而进行推荐。所以推荐系统和搜索系统是互补的关系。推荐系统的另一种功能就是发现商品的长尾。

weixin_46132649的博客 1967

lerobot VLA--SmolVLA代码的讲解

2.图像resize至正方形224x224,图像长宽比不变,其他区域用黑色补充,标记为mask=1,若占位图像(摄像头缺失),则 创建全-1像素的占位图像 标记为mask=0,image为[1, 3, 512, 512],img_mask为True,masks列表长度为2,img_masks为2,因为我这里两个相机。文本嵌入:通过embed_language_tokens() 被转换为嵌入表示,lang_emb 是语言的嵌入,包含了语言的语法和语义信息。1.像素值[0,1]->[-1,1]

caokaifa的博客 4067

嵌入式SDIO 总线面试题及参考答案

SDIO 的 4 位总线模式是一种提高数据传输效率的工作模式。在传统的 1 位总线模式下,数据只能通过一根数据线(DAT0)进行传输,这限制了数据传输的带宽和速度。而在 4 位总线模式下,DAT0 - DAT3 这 4 根数据线同时用于数据传输,相当于在同一时间内可以传输 4 倍于 1 位模式的数据量,从而显著提高了数据传输的带宽和速度。要通过 CMD6 命令将 SDIO 总线从当前模式切换到 4 位总线模式,需要遵循以下步骤:第一步,主设备需要确保 SDIO 卡支持 4 位总线模式。

大模型大数据攻城狮的专栏 1719

从零开始搭建搜索推荐系统(五十二)ElasticSearch搜索利器

聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧!(PS:本系列文章以幽默风趣风格为主,较真侠和杠精请绕道~)...

hanyi_的专栏 1547

【100%通过率】2023华为od机试C卷【电脑病毒感染】C语言 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 1042

Leetcode 搜索推荐系统

WechatIMG504.jpeg 题目描述 leetcode 第1268题:搜索推荐系统 你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。 请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可...

Yohann丶blog 249

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【数据结构-Tire树】力扣1268. 搜索推荐系统

输出:[[“baggage”,“bags”,“banner”],[“baggage”,“bags”,“banner”],[“baggage”,“bags”],[“bags”]]输入:products = [“mobile”,“mouse”,“moneypot”,“monitor”,“mousepad”], searchWord = “mouse”输出:[[“havana”],[“havana”],[“havana”],[“havana”],[“havana”],[“havana”]]

sjsjs11的博客 1265

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

逐步实现前缀匹配:LeetCode 搜索推荐系统题解与详解

通过以上步骤,我们实现了一个动态推荐系统,它能在用户逐字输入时提供实时的产品推荐。我们利用字符串的find()方法有效地检查前缀匹配,同时通过逐步构建前缀确保推荐的准确性。这种算法设计思路不仅清晰而且高效,适合处理实际应用中的类似问题。希望本博客能帮助读者更好地理解此算法的实现过程和细节。

qq_22841387的博客 1225

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

力扣1268.搜索推荐系统

【代码】力扣1268.搜索推荐系统。

Pisasama的博客 411

『力扣刷题』5273_搜索推荐系统 解题代码

html: embed_local_images: true embed_svg: true offline: true toc: undefined print_background: false export_on_save: html: false date: 2019-11-24 updated: 2019-11-24 categories: 力扣刷题 title: 『力扣刷题』...

Paradox 550

【C语言】Leetcode1268. 搜索推荐系统

解题思路: 先对products数组按照字母进行排序,然后通过对比前N个search字符串与products 排序后的数组进行对比,如果相同的话,则把字符串添加到返回输出的数组RES里面去。 关键知识点: 1、字符串qsort的应用,尤其cmp函数中,需要使用 return strcmp(*(char **)a, (char **)b); 2、三维字符串数组的输出也需要考虑,尤其是int型的ret...

weixin_43744788的博客 705

python-leetcode-搜索推荐系统

可以使用 Trie(前缀树)来高效存储和检索前缀匹配的产品,同时在 Trie 的每个节点存储最多 3 个字典序最小的产品,以加速查询。

Lucy_wzw的博客 319

[LeetCode解题报告] 1268. 搜索推荐系统

字典树前缀匹配

liuliangcan的博客 211

Leetcode 1268 搜索推荐系统

LeetoCode地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台这道题的题意不难理解,在我们使用搜索引擎的每一天都会遇到,不需要输入完整的关键词,哪怕仅仅只输入一个字,搜索引擎就会自动返回若干以这个字开头的若干查询结果,比如最近爆火的《繁花》电视剧该题目是搜索引擎的极致简化版,每个字符都是a-z这26个小写字母。如果你做过Trie 树相关的题目,很容就能联想到该题目可以以同样的方式求解,当我们建立好Trie 树之后,只要按照searchWord的每个字符进行逐个匹配直到最后一个字符,这

veatheroe的博客 2176

LeetCode、1268. 搜索推荐系统【中等,前缀树+优先队列、排序+前缀匹配】

LeetCode、208. 实现 Trie (前缀树)【中等,自定义数据结构】 题目内容:给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。 请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。 请你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 1455

LeetCode1268 搜索推荐系统

【代码】LeetCode1268 搜索推荐系统。

weixin_53287225的博客 141

Leetcode【搜索推荐系统】

给你一个产品数组products和一个字符串searchWordproducts数组中每个产品都是一个字符串。请你设计一个推荐系统,在依次输入单词searchWord的每一个字母后,推荐products数组中前缀与searchWord相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。请你以二维列表的形式,返回在输入searchWord每个字母后相应的推荐产品的列表。

摸鱼的快乐你不懂 928

LeetCode1268搜索推荐系统

给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。请你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。

JELEE 572
下一篇: 力扣 爬楼梯问题
jackzhangdev
博客等级 码龄6年 8粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值