1. 两数之和(twoSum)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解1:
查看代码
/***
执行用时:72 ms, 在所有 PHP 提交中击败了48.81% 的用户
内存消耗:19.9 MB, 在所有 PHP 提交中击败了8.43% 的用户
通过测试用例:57 / 57
*/
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target)
{
$res = [];
$left = [];
$right = [];
$negative = [];
$flag = 1;
if(0 > $target){
$flag = -1;
$target *= $flag;
}
$half = $target / 2;
foreach ($nums as $key => $item) {
$item *= $flag;
if ($half == $item) {
$res[] = $key;
if (2 == count($res))
break;
} elseif (0 >= $item) {
if (!in_array($item, $negative))
$negative[$key] = $item;
} elseif ($item < $target) {
if (!in_array($item, $left))
$left[$key] = $item;
} else {
if (!in_array($item, $right))
$right[$key] = $item;
}
}
if (!empty($res) && 2 == count($res))
return $res;
else
$res = [];
$new_left = array_flip($left);
foreach ($new_left as $index=>$value) {
$end = $target - $index;
if (isset($new_left[$end]) && $index != $end) {
$res[] = $new_left[$index];
$res[] = $new_left[$end];
break;
}
}
if (!empty($res))
return $res;
foreach ($negative as $key => $item) {
foreach ($right as $key1 => $item1) {
if ($item + $item1 == $target) {
$res[] = $key;
$res[] = $key1;
break;
}
}
if (!empty($res))
break;
}
return $res;
}
}
题解2:
查看代码
/***
执行用时:1532 ms, 在所有 PHP 提交中击败了6.34% 的用户
内存消耗:19.2 MB, 在所有 PHP 提交中击败了93.16% 的用户
通过测试用例:57 / 57
*/
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target)
{
$res = [];
foreach ($nums as $key => $item) {
foreach ($nums as $key1 => $item1) {
if ($key != $key1 && $target == $item + $item1) {
$res[] = $key;
$res[] = $key1;
break;
}
}
if (!empty($res))
break;
}
return $res;
}
}
题解3:
查看代码
/***
执行用时:68 ms, 在所有 PHP 提交中击败了49.56% 的用户
内存消耗:20 MB, 在所有 PHP 提交中击败了5.05% 的用户
通过测试用例:57 / 57
*/
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target)
{
$res = [];
$right = [];
$left = [];
$half = $target / 2;
foreach ($nums as $key => $item) {
if ($half == $item) {
$res[] = $key;
if (2 == count($res))
break;
} elseif ($half > $item) {
if (!in_array($item, $left))
$left[$key] = $item;
} else {
if (!in_array($item, $right))
$right[$key] = $item;
}
}
if (!empty($res) && 2 == count($res))
return $res;
else
$res = [];
foreach ($left as $key => $item) {
$item1 = $target - $item;
if (in_array($item1, $right)) {
foreach ($right as $k => $v) {
if ($item1 == $v) {
$res[] = $key;
$res[] = $k;
break;
}
}
}
if (!empty($res))
break;
}
return $res;
}
}
题解4:
查看代码
/***
执行用时:36 ms, 在所有 PHP 提交中击败了50.48% 的用户
内存消耗:20.3 MB, 在所有 PHP 提交中击败了5.05% 的用户
通过测试用例:57 / 57
*/
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target)
{
$res = [];
$complement = [];
$half = $target / 2;
foreach ($nums as $key => $item) {
if ($half == $item) {
$res[] = $key;
if (2 == count($res))
break;
} else {
$complement[] = $target - $item;
}
}
if (2 == count($res))
return $res;
$complement = array_unique($complement);
$intersection = array_intersect($nums, $complement);
$index1 = -1;
$index2 = -1;
$v2 = null;
$flag = true;
foreach ($intersection as $k => $v) {
if ($flag) {
$index1 = $k;
$v2 = $target - $v;
$flag = false;
} elseif ($v2 == $v) {
$index2 = $k;
break;
}
}
return [$index1, $index2];
}
}
题解5:(更新于2022-06-25)
查看代码
/***
执行用时:12 ms, 在所有 PHP 提交中击败了95.51% 的用户
内存消耗:19.5 MB, 在所有 PHP 提交中击败了47.50% 的用户
通过测试用例:57 / 57
*/
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target)
{
$res = [];
$a = [];
$b = [];
$half = $target / 2;
foreach ($nums as $key => $item) {
if ($half == $item) {
$res[] = $key;
if (2 == count($res))
break;
continue;
}
$other = $target - $item;
if (0 <= $other && isset($a[$other])) {
$res = [$a[$other], $key];
break;
} elseif (0 > $other && isset($b[-1 * $other])) {
$res = [$b[-1 * $other], $key];
break;
}
if (0 > $item) {
$item *= -1;
$b[$item] = $key;
} else {
$a[$item] = $key;
}
}
return $res;
}
}
本文来自博客园,作者:tros,转载请注明原文链接:https://www.cnblogs.com/tros/p/16409345.html

浙公网安备 33010602011771号