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 '无解';
}