一、题目: 两数之和
二、题目解析:
题目解析:
- 暴力破解:看到题目我们可能会想到暴力破解,来一个双重循环,遍历数组当中的每一个元素和数组当中其他元素进行比较,看是否有两个数相加等于目标值,这种实现起来比较简单,但时间复杂度为O(n^2)过大。
- 进阶: 利用HashMap,将nums[i]当做key,i当做value,每次遍历时判断map中是否存在 target - nums[i],
存在则返回当前target - nums[i]对应value和当前下标即可,不存在则将nums[i]当做key,i当做value放入map,循环遍历,直到找到为止。- 进阶解题步骤:
3.1 创建一个Map
3.2 for循环遍历nums数组
3.3 用target - nums[i],用来计算哪个数能跟当前的数字相加得到target
3.4. 检查map中是否存在该数,有则返回结果,没有则将nums[i]当做key,i当做value放入map
思考:为甚么要把value当做key,元素下标当做value?
这里主要是用到了map.containsKey()方法检查实际的value值,而不是下标。
三、代码如下:
public static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
// 判断map里是否包含
if (map.containsKey(complement)) {
return new int[] { map.get(complement) , i };
} else {
map.put(nums[i], i);
}
}
return new int[2];
}
四、测试
五、结束