题目
题解
1.暴力破解(双重for)
双重for循环直接暴力遍历出所有。
/**
* @思路 暴力破解,双重循环查找,找到则退出
* @时间复杂度 O(n^2)
* @复杂度 O(1)
*/
public static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (target == nums[i] + nums[j]) {
return new int[]{i, j};
}
}
}
throw new IllegalArgumentException("No two sum solution.");
}
2.哈希表
用空间换时间。
先将所有数存放到哈希表,再遍历一次所有数,遍历的同时查找哈希表中是否有另一个值。
/**
* @思路 空间换时间,用哈希表。
* 第一个for循环将所有数都放入map,
* 第二个for循环用来查找另一个数,如果找到另一个数,并且那个数不为当前数nums[i],则返回。
* @时间复杂度 O(n)
* @空间复杂度 O(n)
*/
public static int[] twoSum2(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 another = target - nums[i];
// 包含另一个数,且这个数不是当前i
if (map.containsKey(another) && map.get(another) != i) {
return new int[]{i, map.get(another)};
}
}
throw new IllegalArgumentException("No two sum solution.");
}
3.哈希表(优化)
空间换时间
遍历所有数,如果在当前数之前,需要查找的另一个值已经存在,则直接返回。否则放入map继续查找。
/**
* @思路 同上,优化一下
* 单个for循环,先查找map中是否包含另一个数,如果包含另一个数则返回。
* 不包含则将当前数放入。
*/
public static int[] twoSum3(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
// 另一个数
int another = target - nums[i];
// 包含另一个数
if (map.containsKey(another)) {
return new int[]{map.get(another), i};
}
// 放入当前数
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution.");
}
参考
LeetCode官方题解