//如何在陣列中找到和為 “特定值” 的三個數?
阿新 • • 發佈:2020-10-22
第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));