如何在两数之和问题中正确去重并返回无重复的数值对

星枫姑娘_9188

星枫姑娘_9188

2026-04-04

650人浏览

原创

如何在两数之和问题中正确去重并返回无重复的数值对

本文详解如何在“两数之和”问题中避免生成重复数对(如 (4,8) 和 (8,4))及自匹配(如 (6,6) 仅当同一索引被误用时),通过双指针式遍历与逻辑约束实现天然去重,无需额外哈希去重开销。

本文详解如何在“两数之和”问题中避免生成重复数对(如 (4,8) 和 (8,4))及自匹配(如 (6,6) 仅当同一索引被误用时),通过双指针式遍历与逻辑约束实现天然去重,无需额外哈希去重开销。

在经典的「两数之和」问题中,目标是找出数组中两个不同位置的元素,使其和等于目标值,并返回它们的数值对(非索引)。但许多初学者采用哈希表预存值→遍历查找的策略时,容易因未控制遍历顺序与匹配条件,导致重复结果——例如输入 {1, 4, 3, 5, 6, 8}、target = 12 时输出 (4,8)、(6,6)、(8,4),其中 (4,8) 与 (8,4) 语义重复,而 (6,6) 若源自同一元素(如 arr[4] = 6 被用了两次)则违反“两个数”的题意。

根本原因在于原哈希方案存在两大缺陷:

  • 无索引约束:map.put(arr[i], i) 覆盖同值的多个索引,后续 map.get(target - j) 可能取到与当前 j 相同的索引;
  • 无序遍历:对 arr 元素直接遍历,未保证 i

✅ 正确解法是回归本质:使用嵌套循环 + 严格索引偏移,天然规避重复与自匹配:

public static class Pair {
    int x, y;
    public Pair(int x, int y) { this.x = x; this.y = y; }
    @Override
    public String toString() {
        return "{" + "x=" + x + ", y=" + y + '}';
    }
}

public static ArrayList<pair> twoSum(int[] arr, int target) {
    ArrayList<pair> result = new ArrayList();
    // 外层遍历至倒数第二个元素,内层从 i+1 开始 → 确保 i <p>调用示例:</p><pre class="brush:php;toolbar:false;">int[] arr = {1, 4, 3, 5, 6, 8};
int target = 9;
System.out.println(twoSum(arr, target)); 
// 输出:[{x=1, y=8}, {x=4, y=5}, {x=3, y=6}]

? 关键设计说明:

  • j = i + 1 保证每对 (i,j) 唯一且 i
  • 若需返回索引对(如 LeetCode 原题要求),只需将 new Pair(i, j) 替换即可,逻辑不变;
  • 时间复杂度为 O(n²),空间复杂度 O(1)(不计结果集),适用于中小规模数据;若需 O(n) 时间,可改用哈希表 + 单次遍历(边查边存),但必须在 put 前检查 containsKey,且只添加 i

总结:去重不是“事后过滤”,而是“事前预防”。通过索引约束与遍历顺序设计,让合法解自然唯一,这才是工程实践中最可靠、最易维护的解法。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

359

31

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

590

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

513

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

283

6

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

60

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

40

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.8万人学习