//如何在数组中找到和为 “特定值” 的三个数?
第1轮,访问数组的第1个元素1,把问题转化成从后面元素中找出和为12(13-1)的两个数。
如何找出和为12的两个数呢?我们设置两个指针,指针j指向剩余元素中最左侧的元素2,指针k指向最右侧的元素12:
计算两指针对应元素之和,2+12 = 14 > 12,结果偏大了。
由于数组是按照升序排列,k左侧的元素一定小于k,因此我们把指针k左移一位:
计算两指针对应元素之和,2+9 = 11< 12,这次结果又偏小了。
j右侧的元素一定大于j,因此我们把指针j右移一位:
计算两指针对应元素之和,3+9 = 12,正好符合要求!
因此我们成功找到了一组匹配的组合:1,3,9,已此类推遍历完整个数组
/**
* 使用双指针法
**/
function threeSum(array $nums,$target){ sort($nums); $resultList = []; $length = count($nums); for($i = 0;$i < $length;$i++){ $d = $target - $nums[$i]; for($j = $i + 1,$k = $length - 1;$j < $length;$j++){ while($j < $k && ($nums[$j] + $nums[$k]) > $d){ $k--; } if($j == $k){ break; } if($nums[$j] + $nums[$k] == $d){ $resultList[] = [$nums[$i],$nums[$j],$nums[$k]]; } } } return $resultList; } print_r(threeSum([5,12,6,3,9,2,1,7],13));