问题描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1. 暴力法
遍历每个元素 xx,并查找是否存在一个值与 target - x相等的目标元素。
时间复杂度:O(n^2)
空间负责度:O(1)
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
本人尝试:
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0; i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
注意项:
1. nums.length 访问数组的长度是length, 不是lengths
2. 数组的定义;
1) int[] i = new int[5];
2) int[] i = new int[]{0,1};
3) int[] i ={0,1};
3. throw new IlegalArgumentException("No two sum solution"); 抛出异常
两遍哈希表
通过以空间换取速度的方式,我们可以将查找时间从 O(n) 降低到 O(1)。哈希表正是为此目的
构建的,它支持以 近似 恒定的时间进行快速查找。我用“近似”来描述,是因为一旦出现冲突,查找用时
可能会退化到 O(n)。
在第一次迭代中,我们将每个元素的值和它的索引添加到表中。然后,在第二次迭代中,
我们将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中。
时间复杂度:O(n)
空间复杂度:O(n)
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);
}
//第二次迭代,将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
//map.containsKey判断Map集合对象中是否包含指定的键值
//map.get获取目标对象的索引
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
一遍哈希表
在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
时间复杂度:O(n)
空间复杂度:O(n)
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");
}