本文已参与「新人创作礼」活动,一起开启掘金创作之路。
解题思路:
读题:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
思路:
首先第一反应就是暴力:
双层for循环,定住外层找内层,一旦内外元素相加为结果target,那么答案就是此时的内外下标,下标存到事先声明好的数组里return 注:这个思路唯一要注意的只有一点,内外两层要错一位(因为自己和自己相加为target的情况不算),此时外层注意别越界 思考: 此方法复杂度为 O(n^2)
太浪费 有没有啥办法能快一些?
利用合适的容器或许能解决问题
哈希表 键值对 ,查找的方式就可以解决问题
用合适的关系抽象出哈希表的键值对 target已知(定值)
与其两层循环去相加出 target 不如去数组里查一个值, 而这个值是一定在数组里的,且这个值应该由target与数组本身元素运算得来 即 a[i]关于target的补数
建立键值对 target-a[i] ~ i
map.(target-a[i], i)
注:同样要注意(自己和自己相加为target的情况不算),所以要从a[i+1]开始查起,如果哈希表里有它,那么就是另外那个加数,且下标为此时的i加上1
最终,返回的是 [map.get(a[i+1]), i+1]
代码
//暴力法
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
for (int i = 0; i <len;i++){
for(int j = 1; j < len;j++){
if(nums[i]+nums[j]==target)
return new int[]{i,j};
}
}
return new int[]{0};
}
// k-v 一一对应的哈希表
class Solution{
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i <len;i++){
if(map.get(target-nums[i]) != null)
return new int[]{map.get(target-nums[i]),i}
map.put(nums[i],i);
}
return new int[]{0};
}
}