目录
题目
解题思路
1. 最简单的思路 暴力破解
因为输出的只有一个数组且这个数组里面只有两个元素,所以就是获得两个值然后包包装成数组即可,所以最简单的思路就是我们一个一个遍历下去,从第一个元素还是比对,咱们说下标,0和1,0和2到0和n-1,然后再从1和2,1和3到1和n-1,所以就是两重循环,且第二个循环从第一个循环量+1开始,所以我们可以这么写
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return null;
}
}
第一个循环从0~n-2第二个循环从第一个循环的基础上+1~n-1,如果匹配就直接返回数组。这是最容易想到的但是也是最慢的速度。
2.使用哈希表
① 思路引入
我们再深入想一下正常数组的话就是我们用下标获得值再进行计算,有没有一种方式可以让我们直接用值进行计算然后对了之后我们再返回一个这个值的下标。
最简单的思路就是创建一个有target+1这么这么大的数组,只要遍历一遍原数组然后存入我们创建的大数组然后我们可以通过0与target,1与target-1,2与tartge-2...我们可以直接二分使用双指针一个从左往中间逼近,另外一个从右边往中间逼近,中途只要匹配到了我们就可以返回了。
思路是不错的,但是呢target的值实在是太大,在题目里面明说了target的范围是
-10^9 <= target <= 10^9
但是还说了nums.length是
2 <= nums.length <= 10^4
所以明显是nums的长度更短,根据target的大小创建有两个问题,一个是占用的内存太大,第二个是还存在负数,那这样的话我们需要创建的大小要更大了。所以思路是不错的,但是做法要pass掉。
根据这个思路我们回想一下数据结构,数组不行,那么哈希表呢,哈希表是什么,可能光学代码的同学们虽然是学了数据结构但是可能对哈希表的印象不深刻,那我们用两个语言里的说法来唤醒思路,java里的Map,python里的字典dictionary。是不是就有印象了,使用键值对的方式,是不是就免去了我们的这么大的数组的方式。
所以我们存储的时候可以通过nums的值作为Map的键,然后nums的下标作为Map的值这样子来存储。但是我们还需要排除一个问题,就是先存储后取值的时候会出现比如例子里的6,然后值是3+3然后存值的时候因为键是唯一的所以会覆盖掉,所以我们得考虑一下能不能在单次遍历内进行匹。当然是可以的,经过一系列的分析,大家应该是能看懂的。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int key = target - nums[i];
if (map.containsKey(key)) {
return new int[]{map.get(key), i};
}
map.put(nums[i], i);
}
return null;
}
}
如果对你有帮助的话不要忘记点赞收藏。