题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例1:
1 | 输入:nums = [2,7,11,15], target = 9 |
示例2:
1 | 输入:nums = [3,2,4], target = 6 |
示例3:
1 | 输入:nums = [3,3], target = 6 |
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
进阶:
你可以想出一个时间复杂度小于 O(n2)
的算法吗?
解法
解法一: 暴力破解
遍历两遍列表,找到对应的元素x,和 target - x 即可。时间复杂度为O(n*n)。
需要注意的是,每个位于元素x之前的数字都已经和x匹配过,因此不需要再次进行匹配。并且每一个元素不能被使用两次,所以我们只需要在x后面的元素中寻找target-x。
java
1 | public int[] twoSum(int[] nums, int target) { |
解法二:二次遍历+HashMap
借助HashMap将数值和位置的关系保存起来。然后再遍历nums,判断X和target-X是否同时在HashMap中即可。时间复杂度为O(n),空间复杂度为O(n)。
Java
1 | public int[] twoSum(int[] nums, int target) { |
解法三:一次遍历
只遍历一次HashMap。
该解法是在遍历数组时,寻找target - x的值是否在HashMap中,如果未在HashMap中,则现将当前值存入,否则继续遍历。
拿题目nums = [2, 7, 11, 15], target = 9
为例,当遍历到2时,target - x 为 7,7不在HashMap中,将2存入HashMap,接着遍历至7,target - 7 = 2, 此时,2 在HashMap中,完成搜索,直接返回即可。
JAVA
1 | public int[] twoSum(int[] nums, int target) { |
解法四:借助数组,二次遍历
首先拷贝一份数组数据,排序,然后一次遍历用头尾指针找到对应和未target的数值。最后在原nums数组中找到这两个数值的索引,返回即可。
JAVA
1 | class Solution { |