发布时间:2026/7/28 11:19:43
LeetCode 1311题解析:BFS实现好友视频推荐算法 1. 题目解析与需求拆解LeetCode 1311题获取你好友已观看的视频是一个典型的图论与数据结构结合的应用题。题目给定一个社交网络关系图friends数组、用户IDid、观看视频列表watchedVideos和层级数level要求返回指定用户在特定社交层级的好友观看的所有视频并按观看频率和字典序排序。1.1 核心数据结构分析题目涉及三个关键数据结构社交关系图用vectorvector 表示的无向图每个节点代表一个用户边代表好友关系视频观看记录vectorvector 结构每个用户对应一个字符串列表输出要求需要统计特定层级好友观看视频的频率并排序1.2 算法选择依据根据题目特性我们需要使用BFS遍历社交网络找出特定层级的所有好友用哈希表统计视频出现频率对统计结果进行多条件排序选择BFS而非DFS的原因是在社交网络这种图结构中BFS能更高效地按层级遍历节点正好匹配题目特定层级好友的需求。2. 解决方案设计与实现2.1 BFS层级遍历实现vectorstring watchedVideosByFriends(vectorvectorstring watchedVideos, vectorvectorint friends, int id, int level) { queueint q; vectorbool visited(friends.size(), false); q.push(id); visited[id] true; int currentLevel 0; while (!q.empty() currentLevel level) { int size q.size(); for (int i 0; i size; i) { int current q.front(); q.pop(); for (int friendId : friends[current]) { if (!visited[friendId]) { visited[friendId] true; q.push(friendId); } } } currentLevel; } // 后续处理... }关键点说明使用队列实现标准BFSvisited数组避免重复访问currentLevel变量精确控制遍历深度内层循环处理当前层级所有节点2.2 视频统计与排序unordered_mapstring, int videoCount; while (!q.empty()) { int current q.front(); q.pop(); for (string video : watchedVideos[current]) { videoCount[video]; } } vectorpairstring, int videos(videoCount.begin(), videoCount.end()); sort(videos.begin(), videos.end(), [](auto a, auto b) { return a.second b.second ? a.first b.first : a.second b.second; }); vectorstring result; for (auto p : videos) { result.push_back(p.first); } return result;排序逻辑解析使用unordered_map统计视频出现次数将map转为vector 便于排序自定义排序规则先按频率升序同频按字典序最终提取视频名称返回3. 复杂度分析与优化3.1 时间复杂度分解BFS部分O(VE)V为用户数E为好友关系数视频统计O(L×M)L为目标层级好友数M为平均每人观看视频数排序部分O(K log K)K为不同视频数量3.2 空间复杂度分析visited数组O(V)队列最坏O(V)哈希表O(K)排序临时数组O(K)3.3 实际优化技巧提前终止当currentLevel超过目标层级时可提前退出循环内存预分配result.reserve(videoCount.size())避免动态扩容移动语义使用emplace_back替代push_back减少字符串拷贝4. 常见问题与调试技巧4.1 典型错误案例案例1忽略无向图的处理// 错误写法没有标记起始节点为已访问 visited[id] true; // 必须放在q.push(id)之前 q.push(id);案例2层级控制错误// 错误写法错误的位置增加currentLevel while (!q.empty()) { int size q.size(); currentLevel; // 应该在内层循环结束后增加 for (int i 0; i size; i) { // ... } }4.2 调试检查清单边界检查id是否有效0 ≤ id friends.size()level是否为非负整数空输入处理图遍历验证确保所有边都被正确处理无向图要双向考虑检查visited数组的正确更新排序验证测试相同频率不同视频名的排序验证空视频列表的情况4.3 测试用例设计// 测试用例1基础功能验证 TEST_CASE(Basic functionality) { vectorvectorstring videos {{A,B}, {C}, {B,C}, {D}}; vectorvectorint friends {{1,2}, {0,3}, {0}, {1}}; auto res watchedVideosByFriends(videos, friends, 0, 1); REQUIRE(res vectorstring{B,C,A}); } // 测试用例2多层级验证 TEST_CASE(Multiple levels) { vectorvectorstring videos {{A}, {B}, {C}, {D}}; vectorvectorint friends {{1}, {0,2}, {1,3}, {2}}; auto res watchedVideosByFriends(videos, friends, 0, 2); REQUIRE(res vectorstring{C,D}); }5. 工程实践中的扩展思考5.1 实际应用场景这种算法模式可应用于社交网络的内容推荐系统病毒式营销的潜在受众分析网络安全中的信任度传播计算5.2 性能敏感场景优化当数据量极大时如千万级用户改用邻接表存储稀疏社交图使用并行BFS如使用MPI或CUDA对视频统计采用MapReduce模式5.3 C工程化实现建议使用const引用避免不必要的拷贝vectorstring watchedVideosByFriends(const vectorvectorstring watchedVideos, const vectorvectorint friends, int id, int level)添加noexcept修饰符当确定不会抛出异常时vectorstring watchedVideosByFriends(...) noexcept使用结构化绑定(C17)提升可读性for (auto [video, count] : videoCount) { // ... }在解决这类问题时最重要的是建立清晰的解题框架先明确数据结构和算法选择再处理边界条件和优化细节。实际编码时建议先用注释写出各步骤伪代码再逐步实现每个模块最后进行整体测试和优化。

相关新闻

2026/7/28 11:19:43

物联网设备硬件安全芯片SE050的应用与优化

1. 为什么物联网设备需要硬件级安全芯片?在当今万物互联的时代,物联网设备数量呈指数级增长,但随之而来的安全威胁也日益严峻。2023年全球物联网设备数量已超过430亿台,而其中约70%的设备存在不同程度的安全漏洞。传统基于软件的安…

2026/7/28 11:19:43

如何在3分钟内解决Windows和Office激活问题的完整解决方案

如何在3分钟内解决Windows和Office激活问题的完整解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否经常被Windows或Office的激活提醒打断工作?面对复杂的激活流程感到困…

2026/7/28 11:14:43

NBM5100A与PIC18LF45K42在低功耗物联网设计中的协同优化

1. 理解NBM5100A与PIC18LF45K42的协同价值 在低功耗物联网设备设计中,工程师们经常面临一个经典矛盾:微控制器需要周期性唤醒执行任务(如传感器数据采集、无线传输),这些瞬时工作电流可能高达数十mA,而常用…

2026/7/28 12:29:48

Unity对话系统设计:从数据驱动到可扩展架构实现

1. 项目概述:从零构建一个可复用的点击对话系统在Unity里做游戏,尤其是RPG、AVG或者带剧情的独立游戏,对话系统几乎是绕不开的一环。你可能试过用UI Text组件一行行显示,或者用一些简单的协程控制打字机效果,但当角色多…

2026/7/28 12:29:48

大模型文本分块技术:原理、实践与优化

1. 什么是Chunk?大模型处理长文本的核心技术 在AI大模型开发领域,chunk(分块)是处理超长文本输入的基础技术单元。当开发者面对需要喂给大模型的万字文档、百万级代码库或海量数据集时,直接完整输入往往会遇到模型上下…

2026/7/28 12:29:48

文档下载困境如何破解?一个脚本搞定30+平台限制

文档下载困境如何破解?一个脚本搞定30平台限制 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/28 12:29:48

如何快速掌握Wallpaper Engine资源提取:RePKG完全指南

如何快速掌握Wallpaper Engine资源提取:RePKG完全指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的强大资源提取工具&#xf…

2026/7/28 12:24:47

物联网设备硬件级安全方案与SE050集成实践

1. 为什么物联网设备需要硬件级安全方案 在智能家居和工业物联网项目中,我见过太多因安全漏洞导致的数据泄露案例。去年参与某智慧农业项目时,就遇到过传感器节点被恶意注入虚假数据的攻击。传统基于软件的安全方案(如TLS加密)存在…

2026/7/27 9:04:58

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/28 0:03:34

学术论文研究创新点梳理与核心价值提炼指南

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页,找文献翻遍十几个网站还是缺关键资料,写正文卡壳半天憋不出一句话,降重改到凌晨三点结果逻辑全乱,答辩前一天PPT还没做完。别慌,亲测这四个工具能让你少熬半…

2026/7/28 0:03:34

开发商售楼处数字化升级怎么做?

房企的数字化转型投入正在快速增长,据行业数据显示,2025年房企数字化投入规模已突破800亿元,年复合增长率达35%。售楼处的数字化升级不是单一环节的改造,而是从“获客-展示-成交-服务”全链路的系统升级。数字化升级四步法第一步&…

2026/7/28 0:03:34

模型不再值钱之后,AI 编程工具在争什么

2026 年 7 月,AI 编程工具赛道发生了一个标志性转折:模型本身不再值钱了。当 Kimi K3 开源模型在编程基准上击败 GPT 和 Claude,当 GitHub Copilot 第一次把开源模型纳入选择器,当 OpenAI 把 Codex 并入 ChatGPT 做成三合一超级应…

2026/7/28 4:38:09

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…