LeetCode 1311题解析:BFS实现好友视频推荐算法

发布时间:2026/9/15 2:34:37

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/9/15 2:34:30

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

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

2026/9/13 17:41:09

如何在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/9/12 3:44:20

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

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

2026/9/15 2:31:27

基于SpringBoot+Vue3的智慧养老健康管理系统开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 2:31:27

车辆轨迹跟踪NMPC控制器仿真:CasADi+Matlab实现与调参避坑指南

车辆轨迹跟踪控制这块,我一直觉得最磨人的不是控制器理论本身,而是怎么把一套带约束的非线性模型预测控制算法在Matlab里跑通,还得让车辆动力学模型不中途发散。这篇文章是我把一个NMPC车辆仿真项目从零搭起来的过程记录,包含车辆…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码