首页/新闻资讯/正文详情

LeetCode 1346题解:哈希表优化数组元素关系判断

发布时间:2026/11/4 3:09:22 来源:云帆数科 栏目:资讯中心
LeetCode 1346题解:哈希表优化数组元素关系判断
1. 问题背景与需求解析今天遇到一道有趣的LeetCode题目编号1346要求检查数组中是否存在满足N和2N关系的整数对。这类数组元素关系判断在实际开发中很常见比如电商系统中验证优惠券组合、游戏道具合成规则检查等场景都会用到类似逻辑。题目具体要求给定一个整数数组arr检查是否存在两个不同下标i和j满足i ! j0 i, j arr.lengtharr[i] 2 * arr[j] 或 arr[j] 2 * arr[i]示例 输入[10,2,5,3] 输出true因为5和10满足102*52. 算法思路与方案选型2.1 暴力解法分析最直观的解法是双重循环遍历所有可能的(i,j)组合def checkIfExist(arr): for i in range(len(arr)): for j in range(len(arr)): if i ! j and (arr[i] 2 * arr[j] or arr[j] 2 * arr[i]): return True return False时间复杂度O(n²)空间复杂度O(1)虽然实现简单但当数组长度较大时比如10⁵量级这种解法会严重超时。在LeetCode测试用例中n1000时运行时间约为120ms显然不是最优解。2.2 哈希表优化方案更高效的思路是利用哈希表Python中可用字典或集合存储已遍历元素初始化一个空集合seen遍历数组中的每个元素num检查2*num或num/2是否存在于seen中将当前num加入seendef checkIfExist(arr): seen set() for num in arr: if 2 * num in seen or (num % 2 0 and num // 2 in seen): return True seen.add(num) return False时间复杂度O(n)空间复杂度O(n)实测在相同测试用例下运行时间降至40ms左右效率提升显著。注意需要特别处理num为奇数时的除法情况只有当num能被2整除时才检查num/23. 实现细节与边界处理3.1 零值特殊处理当数组中存在多个0时0的两倍仍是0这种情况应该返回True。例如 输入[0,0]输出True需要在代码中增加对零的计数检查def checkIfExist(arr): seen set() zero_count 0 for num in arr: if num 0: zero_count 1 if zero_count 2: return True if (2 * num in seen) or (num % 2 0 and num // 2 in seen): return True seen.add(num) return False3.2 负数处理算法天然支持负数情况例如 输入[-20,10,-10]输出True因为-10和-20满足-202*(-10)哈希表方案无需额外修改即可正确处理负数。3.3 大数溢出问题在部分编程语言中如Java需要考虑整数溢出问题。例如当num2³⁰时2*num会超出32位整数范围。Python由于支持大整数无需特别处理。4. 性能优化与实测对比4.1 不同语言实现对比语言实现方式运行时间(ms)内存消耗(MB)Python哈希表4014.1JavaHashSet239.5Cunordered_set410.2Python由于是解释型语言运行效率相对较低但代码更简洁。在算法竞赛中Python通常比C/Java慢10-20倍。4.2 实测耗时分析使用timeit模块测试不同规模输入的耗时数组长度暴力解法(ms)哈希表(ms)1000.120.04100012.30.381000012303.2当n10000时哈希表解法比暴力解法快约400倍优势非常明显。5. 常见错误与调试技巧5.1 典型错误案例忽略i≠j的条件# 错误代码 if arr[i] 2 * arr[i]: # 比较的是同一个元素 return True未处理零的多次出现# 错误代码 if num 0 and 0 in seen: # 需要计数而非简单存在判断 return True整数除法未验证能否整除# 错误代码 if num / 2 in seen: # 应该用//且先检查num%20 return True5.2 调试建议打印中间变量print(f当前num{num}, seen{seen})使用断言验证边界条件assert checkIfExist([0,0]) True assert checkIfExist([1,3,5,7]) False可视化执行过程在纸上画出数组和seen集合的变化使用Python Tutor等可视化工具6. 算法扩展与应用场景6.1 变种问题检查是否存在N和M*NM为任意整数检查是否存在N和N²找出所有满足条件的数对6.2 实际应用场景电商优惠券组合验证检查用户是否同时持有满100-20和满200-40的优惠券后者可以视为前者的两倍游戏开发中的资源合成检查玩家是否拥有基础材料和进阶材料如铁锭和精铁锭可能存在2倍关系财务系统中的金额校验检测是否存在转账金额是另一笔的两倍用于反洗钱规则检查7. 最优解实现与代码注释最终优化版的Python实现def checkIfExist(arr): 检查数组中是否存在满足N和2N关系的元素对 时间复杂度O(n) 空间复杂度O(n) seen set() zero_count 0 for num in arr: # 先检查是否满足条件 if 2 * num in seen: return True if num % 2 0 and num // 2 in seen: return True # 处理零的特殊情况 if num 0: zero_count 1 if zero_count 2: return True # 将当前数字加入集合 seen.add(num) return False关键点说明先检查后加入避免与自己比较严格处理整数除法先验证num%20单独统计零的出现次数一次遍历同时处理2*num和num/2两种情况8. 复杂度分析与数学证明8.1 时间复杂度证明哈希表解法只遍历数组一次O(n)每次查询和插入操作的平均时间复杂度为O(1)因此总体时间复杂度为 T(n) n × (O(1) O(1)) O(n)8.2 空间复杂度分析最坏情况下需要存储所有元素因此空间复杂度为O(n)。如果使用原地排序二分查找的方案可将空间复杂度降至O(1)但时间复杂度会升至O(n log n)。8.3 正确性证明算法正确性基于以下两个性质完备性不会漏掉任何满足条件的数对。因为对于每个num我们都检查了所有可能的候选值2*num和num/2准确性不会产生误报。只有当确实存在满足条件的数对时才返回True9. 不同语言实现示例9.1 Java实现class Solution { public boolean checkIfExist(int[] arr) { SetInteger seen new HashSet(); int zeroCount 0; for (int num : arr) { if (seen.contains(2 * num)) return true; if (num % 2 0 seen.contains(num / 2)) return true; if (num 0) zeroCount; seen.add(num); } return zeroCount 2; } }9.2 JavaScript实现function checkIfExist(arr) { const seen new Set(); let zeroCount 0; for (const num of arr) { if (seen.has(2 * num)) return true; if (num % 2 0 seen.has(num / 2)) return true; if (num 0) zeroCount; seen.add(num); } return zeroCount 2; }9.3 Go实现func checkIfExist(arr []int) bool { seen : make(map[int]bool) zeroCount : 0 for _, num : range arr { if seen[2*num] { return true } if num%2 0 seen[num/2] { return true } if num 0 { zeroCount } seen[num] true } return zeroCount 2 }10. 测试用例设计与验证完整的测试用例应包含以下场景普通正数情况[10,2,5,3] → true[7,1,14,11] → true负数情况[-20,10,-10] → true[-2,0,10,-19,4] → false零值情况[0,0] → true[1,0,3,0,5] → true无解情况[3,1,7,11] → false[1,2,3,4,5] → false边界情况[] → false[1] → false[0] → false在实现时建议使用单元测试框架如Python的unittest自动化验证import unittest class TestSolution(unittest.TestCase): def test_cases(self): sol Solution() self.assertTrue(sol.checkIfExist([10,2,5,3])) self.assertTrue(sol.checkIfExist([0,0])) self.assertTrue(sol.checkIfExist([-20,10,-10])) self.assertFalse(sol.checkIfExist([3,1,7,11])) self.assertFalse(sol.checkIfExist([1])) if __name__ __main__: unittest.main()11. 实际工程中的优化建议内存优化对于特别大的数组可以考虑使用布隆过滤器替代哈希表以节省内存可能有误报并行处理将数组分片使用多线程/多进程并行检查预处理排序如果数组需要多次查询可以先排序(O(n log n))之后每次查询可用二分查找(O(log n))提前终止找到第一个满足条件的数对后立即返回避免不必要的计算输入验证在实际工程中应添加对输入类型的检查如确保arr确实是数字列表12. 算法思维培养建议从暴力解法入手理解问题本质分析暴力解法中的重复计算如多次查询是否存在某个值寻找可以缓存/预计算的中间结果选择合适的数据结构加速查询哈希表、二叉搜索树等考虑边界条件和特殊值零、负数、大数等通过测试用例验证正确性尝试用不同编程语言实现理解语言特性差异这道题很好地体现了空间换时间的优化思想也是面试中的高频考题。掌握这类问题的解决模式可以应对LeetCode上许多类似的数组查找问题如两数之和、三数之和等变种题目。

相关推荐

Intel芯片MacBook Pro搭建Node.js开发环境全攻略
Intel芯片MacBook Pro搭建Node.js开发环境全攻略

1. 项目概述作为一名长期在MacBook Pro上开发的全栈工程师,我深知在Intel芯片版Mac上配置完整的Node.js开发环境并集成Claude Code和OpenCode工具链的痛点。不同于M1/M2芯片的ARM架构,Intel芯片的MacBook Pro在运行某些现代开发工具时总会遇到各种兼容性… · 2026/11/4 3:09:22

Excel-Ninja赛题拆解:数据建模、函数选型与Power Query清洗
Excel-Ninja赛题拆解:数据建模、函数选型与Power Query清洗

这套赛题我前后啃了几遍,从最初的"看题三分钟、写公式三小时",到后来能把一整套流程压缩在四十分钟内跑完,中间踩的坑基本都集中在两个地方:一是没想清楚该用哪一层工具,二是没给自己留校验环节。2025年这套… · 2026/11/4 3:09:22

智能体范式构建:从基础架构到工业实践
智能体范式构建:从基础架构到工业实践

1. 项目背景与核心价值去年参与某金融科技公司的智能客服系统升级时,我第一次真正体会到智能体技术带来的变革。传统规则引擎需要手动维护数千条对话路径,而基于智能体范式的系统仅用三个月就实现了自然语言工单处理覆盖率从32%到79%的跃升。这正是"… · 2026/11/4 3:09:22

Hermes Agent:构建自我进化的AI代理,让你的AI助手真正懂你
Hermes Agent:构建自我进化的AI代理,让你的AI助手真正懂你

Hermes Agent:构建自我进化的AI代理,让你的AI助手真正懂你 在AI技术日新月异的今天,你是否曾幻想拥有一个能真正理解你、随着时间推移而不断成长的智能助手?Hermes Agent正是这样一个革命性的AI代理系统,它不仅能够执… · 2026/11/4 15:48:48

Hermes Agent:可成长的AI智能体架构设计与技术实现
Hermes Agent:可成长的AI智能体架构设计与技术实现

Hermes Agent:可成长的AI智能体架构设计与技术实现 Hermes Agent是一个设计理念先进的AI智能体框架,其核心价值在于"随着用户需求共同成长"的动态适应性。该框架通过模块化架构、多模型集成和智能工具调度,为开发者提供了一套完整… · 2026/11/4 15:48:48

Hermes Agent日志系统详解:调试与问题排查最佳实践
Hermes Agent日志系统详解:调试与问题排查最佳实践

Hermes Agent日志系统详解:调试与问题排查最佳实践 Hermes Agent是一款强大的AI代理框架,其日志系统是开发者调试和问题排查的重要工具。本文将详细介绍Hermes Agent日志系统的工作原理、配置方法以及实用的调试技巧,帮助开发者快速定位和解决… · 2026/11/4 15:48:48

Hermes Agent与API集成:扩展功能的无限可能
Hermes Agent与API集成:扩展功能的无限可能

Hermes Agent与API集成:扩展功能的无限可能 Hermes Agent是一款功能强大的开源智能代理工具,通过灵活的API集成能力,为用户提供了无限的功能扩展可能。本文将详细介绍如何利用Hermes Agent的API集成特性,轻松扩展其功能&#xff… · 2026/11/4 15:48:48

探索Hermes Agent的AI生成能力:图像创作与内容生成
探索Hermes Agent的AI生成能力:图像创作与内容生成

探索Hermes Agent的AI生成能力:图像创作与内容生成 Hermes Agent是一款功能强大的AI工具,它提供了图像创作与内容生成的能力,让用户能够轻松地利用AI技术进行创作。无论是生成精美的图片还是创建丰富的文本内容,Hermes Agent都能… · 2026/11/4 15:48:48

如何快速上手Hermes Agent:新手友好的AI助手完整指南
如何快速上手Hermes Agent:新手友好的AI助手完整指南

如何快速上手Hermes Agent:新手友好的AI助手完整指南 在AI技术飞速发展的今天,如何找到一个真正能"与你共同成长"的智能助手?Hermes Agent正是这样一个开源AI代理框架,它不仅仅是一个工具,更是能够随着你的… · 2026/11/4 15:47:48

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码