(一)题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
(二)输入、输出示例
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
(三)代码实现
方法1:
解题思路
1.最简单的方式,使用双重循环,比较两个数的值是否等于目标值target,若相等则获取当前两个元素的k。
2.注意:题目描述中要求数据中同一个元素不能使用两边,所以双重循环时,外层的i和内层的j的值相等时需要使用continue跳过。
代码实现
class Solution { /** * @param Integer[] $nums * @param Integer $target * @return Integer[] */ function twoSum($nums, $target) { $suc = []; foreach($nums as $k_1 => $v_1){ foreach ($nums as $k_2 => $v_2){ if($k_2 == $k_1){ continue; } if($v_1 + $v_2 == $target){ $suc = [$k_1, $k_2]; } } } return $suc; } }
方法2:
解题思路
1.使用单层循环,减少双层的开支。
2.空间换时间。用目标值减去第一个元素的值作差,将差值存入新的变量found中,以差值为key,以第一个元素的下标值做value。如target=9,第一个元素值v=2(下标k=0),所以差值diff=7。将差值diff=7存入新变量found中,key等于差值7,value等于第一个元素的下标值0,结束对第一个元素的操作。 当单层循环判断第二个元素时,判断found中是否存在以第二个元素为k的值,若存在则找到元素。
代码实现
class Solution { /** * @param Integer[] $nums * @param Integer $target * @return Integer[] */ function twoSum($nums, $target) { $found = []; foreach ($nums as $k => $v) { $diff = $target - $v; if (!isset($found[$diff])) { $found[$v] = $k; continue; } return [$found[$diff], $k]; } } }
(四)性能分析
实现方案 | 运行时间 | 内存消耗 | 测试用例通过数/测试用例总数 |
方法一(双层循环) | 2900ms | 15.9 MB | 29/29 |
方法二(单层循环) | 12ms | 15.8 MB | 29/29 |