一.Two Sum(两数的和)
1.题目描述
Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order.
2.Example
Input: nums = [2,7,11,15],target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 1].
Input: nums = [3,2,4], target = 6
Output: [1,2]
3.Solution
1.暴力解
两个for循环寻找相加和为target的数即可
2.双遍历哈希表
一个for循环将键值对加入hashmap,另一个for循环寻找hashmap中是否含有和nums[i]相加为target的数(使用containsKey(target - nums[i]);),注意不能和nums[i]自身相同。
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
3.单遍历哈希表
一边向hashmap中添加nums[i]一边回顾之前已添加的key之中是否含有值为target -nums[i]的数,因为是先判断再向map里添加所以不用if判断是否是和自身相等的情况。
public 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];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}