LeetCode#1-Two Sum-两数之和

一、题目

给定一个整数数组和一个目标值,在数组中找出和为目标值的那两个整数,并返回这两个数的数组下标。
可以假设每个输入都会有唯一解,并且一个元素只能用一次。
示例:

给定 nums = [2, 7, 11, 15], target = 9,
 
因为 nums[0] + nums[1] = 2 + 7 = 9,
所以返回 [0, 1].

二、题解

  • 解法1:暴力法

首当其冲的,就是暴力破解,两个 for 循环就能搞定,我这脑瓜子果然简单😂

第一个数分别和后面三个数相加;第二个数分别和后面两个数相加;第三个数和最后一个数相加;最后一个数已经和前面三个数相加过了,所以不用再相加。
所以:两个循环,第一个循环从第一个数开始遍历,第二个循环从第一个数后面的数开始,两个数相加,外循环和内循环的层数即两个数字的索引。
时间复杂度:O(n²),空间复杂度:O(1)

function twoSum($nums, $target) {
    for ($i = 0; $i < count($nums) - 1; $i++) {
        for ($j = $i + 1; $j < count($nums); $j++) {
            if ($nums[$i] + $nums[$j] == $target) {
                return [$i, $j];
            } 
        }
    }
    echo "无解";
}
  • 解法2:哈希表(即 PHP 中的一维数组)

遍历给定数组时,可以查看目标值减去该元素的差值是否存在于哈希表中,若不存在,则将该元素存到哈希表中(key为元素值,value为元素的下标),往后遍历的时候,看差值是否在哈希表中,若存在则找到解。
时间复杂度:O(n),空间复杂度:O(n)

function twoSum($nums, $target) {
        $arr = [];
        foreach ($nums as $k => $num) {
            if (!isset($arr[$target - $num])) {
                $arr[$num] = $k;
                continue;
            } 
            return [$arr[$target - $num], $k];
        }
        echo '无解';
    }
posted @ 2020-02-02 23:31  鹿呦呦  阅读(343)  评论(0编辑  收藏  举报