1. 程式人生 > 實用技巧 >//如何在陣列中找到和為 “特定值” 的三個數?

//如何在陣列中找到和為 “特定值” 的三個數?

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