//如何在数组中找到和为 “特定值” 的三个数?

第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));

 

posted @ 2020-10-22 17:59  zhang-san  阅读(325)  评论(0编辑  收藏  举报