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;
    }
}

 

posted @ 2022-06-24 16:20  tros  阅读(84)  评论(0)    收藏  举报