力扣刷题——1. 两数之和

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题语言

PHP

解题思路

因为求两数之和,我首先想的是进行排序,这样后期查找能节省一定时间,但是快排的时间复杂度为nlogn,后期还需要对数组进行双重循环,时间复杂度为n2,所以排序只会增加时间复杂度。

由于最终需要获取数组下标,所以我决定再创建一个数组,将原有数组下标及数组值与目标值的差值记录下,并在原数组中循环查找新数组是否有与其匹配的值,此时的时间复杂度为n2,代码如下:

class Solution {

    /**
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum($nums, $target) {
        $arr = array();
        $length = count($nums);

        for($i = 0; $i < $length; $i++){
            if(strlen($index = array_search($nums[$i], $arr))){
                $brs = array($index, $i);

                return $brs;
            }

            $arr[$i] = $target - $nums[$i];
        }
    }
}

但是在PHP中查找数组值需要遍历数组,所以我决定将新数组的键值对翻转,将数组值与目标值的差值作为数组键,这样只需要在原数组循环时在新数组中查找是否存在原数组值的键值即可,此时时间复杂度为n,代码如下:

class Solution {

    /**
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum($nums, $target) {
        $arr = array();
        $length = count($nums);

        for($i = 0; $i < $length; $i++){
            if(array_key_exists($nums[$i], $arr)){
                $brs = array($arr[$nums[$i]], $i);

                return $brs;
            }

            $arr[$target - $nums[$i]] = $i;
        }
    }
}

你可能感兴趣的:(力扣刷题——1. 两数之和)