通过率 51% · 提交 472 · 通过 242
小慕正在处理一个整数数组nums,他需要从这个数组中找出两个数,使得这两个数的和的abs(nums[x] + nums[y])最小,并按照从小到大的顺序返回这两个数以及它们和的绝对值。每种输入只会对应一个答案。。
这类题属于华为 OD 机考真题方向中「100分 / 双指针」方向的高频题型,通常考察对「100分 / 双指针」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
一个通过空格分割的整数序列字符串,最多1000个整数,且整数数值范围是[-65535,65535]
两个数以及两数之和绝对值
示例 1
输入示例
-1 -3 7 5 11 15
输出示例
-3 5 2
因为abs(nums[0]+nums[2]) = abs(-3+5) = 2在所有数对中最小,所以返回-3 5 2
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意,本题和 两数之和 II - 输入有序数组 解题方法非常类似。但在判断指针移动的条件上,稍微有些不同。
要用上 相向双指针,首先要对 lst 数组进行排序。
两个数的和的 绝对值越小,说明这两个数的和越接近于 0。所以这道题可以换一种问法:找到两个数使得它们的和尽可能地接近 0。我们可以使用相向双指针 left 和 right 指向一小一大两个数,当:
lst[left] + lst[right] > 0 时,如果令 left 右移,两数和会进一步增大,距离 0 更远,因此需要令 right 左移。lst[left] + lst[right] < 0 时,如果令 right 左移,两数和会进一步减小,距离 0 更远,因此需要令 left 右移。lst[left] + lst[right] == 0 时,两数和的绝对值已经达到最小,可以直接退出循环。另外,对于每对两数和 sum2 = lst[left] + lst[right],我们都应该令其绝对值与之前的得到最小两数和绝对值进行比较并更新。上述思路整理为代码即:
如果没有想到上述方法,在选择 left 和 right 移动哪一个的问题上,我们也可以直接考虑移动后的结果。当:
abs(lst[left+1] + lst[right]) < abs(lst[left] + lst[right-1]),即 left 右移后两数和的绝对值小于 right 左移的结果,那么我们令 left 右移。abs(lst[left+1] + lst[right]) >= abs(lst[left] + lst[right-1]),即 left 右移后两数和的绝对值大于等于 right 左移的结果,那么我们令 right 左移。上述思路整理为代码即:
将题目转化为考虑最接近 target = 0 的两数和。
复杂度分析 设输入数组的长度为 n。
总时间复杂度为 O(n log n),由排序主导;空间复杂度为 O(n),用于存放解析后的数字列表(排序在列表上原地进行,额外空间只有常数个变量和长度为 3 的答案列表)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有