LeetCode 1442:异或相等三元组的高效解法
1. 题目解析与核心概念这道题目来自LeetCode第1442题题目描述如下给定一个整数数组arr我们需要统计能够形成两个异或相等数组的三元组(i, j, k)的数目其中0 ≤ i j ≤ k arr.length。首先我们需要明确几个关键概念三元组(i, j, k)表示数组中的三个索引位置满足i j ≤ k的关系异或(XOR)运算按位异或操作相同为0不同为1异或相等数组题目中定义a arr[i] ^ arr[i1] ^ ... ^ arr[j-1]b arr[j] ^ arr[j1] ^ ... ^ arr[k]要求a b理解这个题目需要掌握异或运算的一个重要性质如果a ^ b 0那么a b。这个性质是解决本题的关键。2. 异或运算的性质与应用异或运算有几个非常重要的性质在解决这个问题时需要充分理解交换律a ^ b b ^ a结合律a ^ (b ^ c) (a ^ b) ^ c自反性a ^ a 0恒等性a ^ 0 a基于这些性质我们可以推导出一个重要的结论如果a ^ b 0那么a b。这个结论直接对应题目中要求a b的条件。另一个关键点是异或前缀和的概念。我们可以预先计算一个前缀异或数组xor其中xor[i]表示arr[0] ^ arr[1] ^ ... ^ arr[i-1]。这样任意子数组arr[i..j]的异或和可以表示为xor[j1] ^ xor[i]。3. 暴力解法与分析最直观的解法是使用三重循环枚举所有可能的三元组(i, j, k)然后计算a和b的值进行比较def countTriplets(arr): n len(arr) count 0 for i in range(n): for j in range(i1, n): a 0 for x in range(i, j): a ^ arr[x] for k in range(j, n): b 0 for y in range(j, k1): b ^ arr[y] if a b: count 1 return count这个解法的时间复杂度是O(n^4)因为有三重循环且在最内层还有计算a和b的循环。对于较大的n来说这种解法显然效率太低无法通过LeetCode的测试用例。4. 优化思路与数学推导我们需要寻找更高效的解法。根据异或的性质我们知道如果a b那么a ^ b 0。而根据前缀异或的定义a ^ b (arr[i] ^ ... ^ arr[j-1]) ^ (arr[j] ^ ... ^ arr[k]) arr[i] ^ ... ^ arr[k] xor[k1] ^ xor[i]因此a b等价于xor[k1] ^ xor[i] 0即xor[k1] xor[i]。这意味着对于任意i和k如果xor[k1] xor[i]那么对于i和k之间的任意ji j ≤ k三元组(i, j, k)都满足题目条件。因此这样的(i, k)对对应的有效j的数目是k - i。基于这个观察我们可以将问题转化为统计所有满足xor[k1] xor[i]的(i, k)对然后对每个这样的对累加k - i到结果中。5. 优化后的算法实现基于上述推导我们可以实现一个O(n^2)的解法def countTriplets(arr): n len(arr) xor [0] * (n 1) for i in range(n): xor[i1] xor[i] ^ arr[i] count 0 for i in range(n): for k in range(i1, n): if xor[k1] xor[i]: count (k - i) return count这个解法首先计算前缀异或数组xor然后双重循环遍历所有可能的i和ki k检查xor[k1]是否等于xor[i]如果相等则累加k - i到结果中。6. 进一步优化到O(n)我们可以进一步优化这个解法到O(n)时间复杂度。观察到对于每个k我们需要统计前面所有i满足xor[i] xor[k1]的(k - i)之和。我们可以使用一个哈希表来记录每个异或值出现的次数和位置索引的和。具体来说维护一个字典记录每个异或值出现的次数count和所有出现该异或值的索引i的和total对于每个位置k计算当前前缀异或xor[k1]如果xor[k1]在字典中则结果增加count * k - total更新字典将当前xor[i]即xor[k]的信息存入字典实现代码如下def countTriplets(arr): n len(arr) xor 0 count_map {0: (1, 0)} # (count, total_index_sum) res 0 for k in range(n): xor ^ arr[k] if xor in count_map: cnt, total count_map[xor] res cnt * k - total # 更新xor ^ arr[k]的信息即xor[i]的信息 if xor in count_map: cnt, total count_map[xor] count_map[xor] (cnt 1, total k 1) else: count_map[xor] (1, k 1) return res这个解法只需要一次遍历数组时间复杂度降为O(n)空间复杂度为O(n)用于存储哈希表。7. 代码实现细节与测试让我们详细分析一下最优解法的实现细节初始化xor为0表示空数组的异或和初始化count_map记录异或值为0出现了1次位置索引和为0遍历数组计算当前的前缀异或xor ^ arr[k]如果当前xor在count_map中说明存在i使得xor[i] xor[k1]可以形成有效三元组计算结果res cnt * k - totalcnt是相同异或值出现的次数total是这些i的和更新count_map将当前xor实际上是xor[i]的值的信息存入测试用例示例print(countTriplets([2,3,1,6,7])) # 输出4 print(countTriplets([1,1,1,1,1])) # 输出10 print(countTriplets([2,3])) # 输出0 print(countTriplets([1,3,5,7,9])) # 输出38. 复杂度分析与比较让我们比较一下三种解法的复杂度暴力解法O(n^4)时间O(1)空间前缀异或优化O(n^2)时间O(n)空间哈希表优化O(n)时间O(n)空间在实际应用中当n较大时如n10^5只有O(n)的解法能够在合理时间内完成。对于LeetCode的测试用例O(n^2)的解法通常也能通过但O(n)是最优解。空间复杂度方面O(n)的解法需要额外的哈希表空间但在现代计算机上这对于中等规模的数组来说不是问题。9. 常见错误与调试技巧在实现这个算法时容易犯的几个错误索引处理错误特别是在计算前缀异或数组时xor[i]表示arr[0..i-1]的异或和容易混淆i的起始位置哈希表更新时机错误应该在计算完结果后再更新哈希表否则会包含当前元素自身三元组条件理解错误必须满足i j ≤ k不能有i j或j k的情况调试技巧对于小数组手动计算几个例子的结果验证代码正确性打印中间变量如前缀异或数组检查计算是否正确使用LeetCode的测试用例和自定义边界条件测试10. 扩展思考与类似题目这个问题可以扩展到更一般的情况比如统计满足其他位运算条件的子数组如AND、OR等统计满足多个条件的复合三元组在树或其他数据结构上应用类似的异或性质类似题目推荐LeetCode 1310. 子数组异或查询LeetCode 1720. 解码异或后的数组LeetCode 1734. 解码异或后的排列这些题目都利用了异或运算的性质来优化解法掌握这些技巧可以大大提高解决位运算相关问题的能力。

相关新闻

Python Tkinter GUI开发入门与实战技巧

Python Tkinter GUI开发入门与实战技巧

1. Tkinter入门:为什么选择Python GUI开发十年前我刚接触Python GUI编程时,面对PyQt、wxPython和Tkinter等多个选择犹豫不决。最终选择Tkinter的原因很简单——它预装在Python标准库中,不需要额外安装任何依赖。对于需要快速开发小型桌面应用…

2026/8/11 4:36:59 阅读更多 →
Havenlon | 杂谈:AI 时代最危险的幻觉,不在模型里

Havenlon | 杂谈:AI 时代最危险的幻觉,不在模型里

导语|企业已经学会防范模型幻觉,却还没有学会防范自己对 AI 能力的误判。前者制造错误信息,后者制造错误组织。 一、真正在扩散的,是经营幻觉 AI 会产生幻觉,这已经不是新闻。整个行业为此建立了大量防线&#xff1a…

2026/8/11 4:36:59 阅读更多 →
Selenium无头浏览器实战:从原理到生产环境部署与优化

Selenium无头浏览器实战:从原理到生产环境部署与优化

1. 项目概述:为什么我们需要无头浏览器?如果你正在用Selenium做自动化测试或者网页数据抓取,大概率遇到过这样的场景:脚本在本地跑得好好的,一放到服务器上就报错,或者你只想在后台默默执行任务&#xff0c…

2026/8/11 4:36:59 阅读更多 →

最新新闻

Django连接MySQL全攻略:跨平台环境配置与避坑指南

Django连接MySQL全攻略:跨平台环境配置与避坑指南

1. 项目概述与核心价值 搞Python Web开发,Django绝对是绕不开的框架,而数据库选型里,MySQL又是最经典、应用最广的关系型数据库之一。把这两者顺畅地连接起来,是每个Django开发者入门后要跨过的第一道“实战坎”。这个项目标题“…

2026/8/11 5:19:49 阅读更多 →
Unity插件选型与实战指南:50款热门工具提升开发效率

Unity插件选型与实战指南:50款热门工具提升开发效率

1. 项目概述:为什么你需要一份Unity插件“藏宝图”?做Unity开发这些年,我最大的感受就是:一个项目能不能高效、高质量地完成,很多时候不取决于你写了多少行代码,而在于你是否知道并善用那些“神器”级别的插…

2026/8/11 5:19:49 阅读更多 →
Node.js文件下载被IDM拦截?详解HTTP下载机制与前后端解决方案

Node.js文件下载被IDM拦截?详解HTTP下载机制与前后端解决方案

1. 问题缘起:当Node.js遇上IDM,一个下载请求的“罗生门”最近在做一个后端数据归档的功能,需要从我们的服务端批量下载一些由Node.js生成的报告文件,这些报告被打包成了ZIP格式。代码很简单,就是最经典的http模块或者a…

2026/8/11 5:19:49 阅读更多 →
Google C++代码规范:变量与函数命名最佳实践

Google C++代码规范:变量与函数命名最佳实践

1. Google C代码规范的核心价值Google C风格指南作为业界公认的代码规范标杆,其核心价值在于建立统一的代码语言。想象一下,当五位工程师面对同一个变量名data时,可能产生五种不同理解:可能是临时缓存、核心业务对象或未处理的输入…

2026/8/11 5:19:49 阅读更多 →
基于Django的物联网平台核心架构:融合IoT与IBMS的双核驱动设计

基于Django的物联网平台核心架构:融合IoT与IBMS的双核驱动设计

1. 项目概述:一个“双核驱动”的物联网平台 最近在整理过去几年的项目代码,决定把之前做的一个物联网平台核心框架开源出来。这个项目有点特殊,它不是一个单纯的设备管理后台,而是从一开始就设计成了“双核”架构:一边…

2026/8/11 5:19:49 阅读更多 →
一键式生成AI漫剧怎么选?知漫剧模型聚合方案与传统管线成本对比

一键式生成AI漫剧怎么选?知漫剧模型聚合方案与传统管线成本对比

在当下的内容自动化生产实践中,AI漫剧已经从原先繁琐的本地多节点串联,转向更高集成度的端到端工作流,不少创作者开始借助工具整合站点知漫剧( qq.jiaxunai.cn )这类AI模型聚合平台,将生图、动态扩展与TTS语音合成统一调度&#x…

2026/8/11 5:18:48 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →