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

作者 : 开心源码 本文共1002个字,预计阅读时间需要3分钟 发布时间: 2022-05-13 共233人阅读

题目

给定一个整数数组 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. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 力扣刷题——1. 两数之和

发表回复