【leetcode】-两数之和
给定一个整数数列,找出其中和为特定值的那两个数。
你可以假设每个输入都只会有一种答案,同样的元素不能被重用。
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
//两层循环,当前元素和当前元素的下一个元素相加并比较 //暴力解法 时间复杂度: O(N^2) function twoSum($arr,$target){ for($i=0;$i<count($arr);$i++){ for($j=$i+1;$j<count($arr)-$i;$j++){ if($arr[$i]+$arr[$j]==$target){ return [$i,$j]; } } } }
思路二: 数组必须有序 维护两个指针,一个指向数组头,一个指向数组尾 两个指针指向的值相加sum if sum>target 则尾指针往前移动 is sum<target 则头指针后移 function twoSum($arr,$target){ $i = 0; $j = count($arr)-1; while ($i<count($arr) && $j>=0) { # code... if($arr[$i] + $arr[$j]== $target){ return [$i,$j]; }elseif($arr[$i] + $arr[$j] > $target){ $j--; }else{ $i++; } } }
思路三:
用target和数组中每个元素相减的值存在一个新数组中,循环遍历$arr看是否有相减后的值存在临时数组中,如存在就返回存在值的键和当前减去值的键
$arr = [2, 7, 11, 15, 18, 31]; $target = 33; $ret = $bu_arr = []; foreach ($arr as $k=>$v){ if(in_array($v, $bu_arr) && array_search($v, $bu_arr)!=$k){ $ret[] = array_search($v, $bu_arr); $ret[] = $k; } $bu_arr[] = $target - $v; } print_R($ret);