[题目描述] 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
[个人见解] 根据题意有如下思路: 这个题目给我们的是一个整数数组,一个目标数target,需要我们在数组中找出两个非同一下标的数字,且这两个数字之和刚好等于目标数target。这里介绍两种思路:
思路一: 1.暴力解法:既然需要寻找两个和为target的整数,并且下标不同,那么我们就采用遍历方式,一组一组的去找,直到找到为止。此方法的实现需要两个for循环,时间复杂度达到了O(n^2),不推荐。 具体代码见[Java Solution One]
思路二: 虽然暴力解法简单明了,但是消耗时间过多,那么有没有更加完美一点的解决方案呢?答案肯定是有的。现在我们要做的其实就是在数组中找出A、B两个数字,使得A+B=C成立。通过式子可以发现,A、B每次都是成对出现(下标不一致),那么通过这个成对我们可以想到一种常见的结构,也就是Map结构。说到这里肯定很多人已经豁然开朗~ 1.遍历数组,每次拿到一个数组中的整数A,然后通过target-A,得到的就是我们需要的另一个整数B。 2.定义一个Map用于存放数组中的数字以及对应得下标,在Map中将B当做Key来判断是否存在,如果存在返回下标;若不存在,则将当前数A以及下标存入Map中。 具体代码见[Java Solution Two]
[Java Solution One]
public int[] twoSum(int[] nums, int target) {
for(int i=0; i<nums.length; i++) {
for(int j=i+1; j<nums.length; j++) {
if(nums[i]+nums[j] > target) {
continue;
}
if(nums[i]+nums[j] == target) {
int arr[] = {i,j};
return arr;
}
}
}
return new int[0];
}
[Java Solution Two]
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
int len = nums.length;
for (int i = 0; i < len; i++) {
if (map.containsKey(target-nums[i])) {
return new int[]{i, map.get(target - nums[i])};
} else {
map.put(nums[i], i);
}
}
return new int[]{};
}
希望本文可以对正在阅读的你有所帮助,在学术思想上擦出火花的可以评论区交流~ 感谢阅读~