关于Triplet Sum Close to Target代码中差值判断逻辑的疑问
三元组最接近目标值的差值判断逻辑解析
先明确代码里的变量定义(从逻辑反推):
currentSum:当前遍历到的三元组的和targetDiff = 目标值 - currentSum:目标值与三元组和的差值,正数表示三元组和比目标值小,负数表示比目标值大smallestDifference:记录当前最优的差值,最终返回的三元组和为目标值 - smallestDifference
整体判断逻辑拆解
if (Math.abs(targetDiff) < Math.abs(smallestDifference) || (Math.abs(targetDiff) == Math.abs(smallestDifference) && targetDiff > smallestDifference))
这个条件用来判断是否需要更新最优差值smallestDifference,分两部分理解:
1. 第一部分:Math.abs(targetDiff) < Math.abs(smallestDifference)
这部分逻辑很直观:新的三元组和与目标值的差值绝对值更小,说明它更接近目标值,必须更新最优差值。
2. 第二部分:Math.abs(targetDiff) == Math.abs(smallestDifference) && targetDiff > smallestDifference
这部分是处理多个三元组和与目标值距离相等的场景,核心目的是选出和最小的那个三元组,下面用例子具体解释:
例子1:目标值=5,现有两个三元组和:7和3
- 对应
targetDiff分别为:5-7=-2、5-3=2,两者绝对值都是2,距离目标值一样近 - 按照题目要求,要选和更小的3。此时如果先遍历到7,
smallestDifference初始为-2;当遍历到3时,targetDiff=2,满足2 > -2,触发更新,把smallestDifference改成2,最终返回的和是5-2=3,符合要求。
例子2:目标值=10,现有两个三元组和:12和8
- 对应
targetDiff分别为:10-12=-2、10-8=2 - 如果先遍历到8,
smallestDifference=2;之后遍历到12时,targetDiff=-2,不满足-2 > 2,所以不更新,依然保留smallestDifference=2,返回和为8,正确。
为什么这个条件能选出和最小的三元组?
因为currentSum = 目标值 - targetDiff,目标值是固定的,所以targetDiff越大,对应的currentSum就越小。在差值绝对值相等的情况下,选更大的targetDiff,就等价于选更小的三元组和,正好匹配题目要求。
内容的提问来源于stack exchange,提问作者isilia
相关产品推荐
相关产品推荐

