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

  

原文地址:https://www.cnblogs.com/oceanL/p/8796089.html