Given an array of integers, return indices of the two numbers such that >they add up to a specific target.
You may assume that each input would have exactly one solution, and you >may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
首先看最普通的实现
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i=0;i<nums.length;i++){
for (int j=1;j<nums.length;j++){
// 循环遍历一个个比较
if (i==j){
// 排除重复使用同一个`位置`的数
continue;
}
if (nums[i]+nums[j]==target){
// 如果相加等于target 返回下标
return new int[]{i,j};
}
}
}
return new int[2];
}
}
这个方法很容易想到,不过时间复杂度O(N^2),超过%0.42(QAQ).当然得用更快一点的办法.
所以我们想,a +b = target 既然知道了a,我直接查找数组中是否有b就行了.在java中hashmap的查找速度相比数组来说是快了很多很多的,所以有了解决办法2
class Solution {
public int[] twoSum(int[] nums, int target) {
// 定义一个HashMap用于存放数组,key存放放值,value存放在数组中的下标
HashMap<Integer,Integer> map = new HashMap<>();
for (int i=0;i<nums.length;i++){
// 当前值是否曾经重复过
Integer a = map.get(nums[i]);
if (a == null){
// 没重复,放入
map.put(nums[i],i);
}else {
// 否则比较两个重复的相加是否等于target
// 注意,两个重复的数如果他们相加!=target,那么第二个数就没必要存入map中了
if (nums[i]*2 == target){
// 如果相等返回它们各自所在下标
return new int[]{a,i};
}
}
// 计算目标值
int t = target - nums[i];
// 查询目标值下标
Integer n = map.get(t);
if (n != null && n != i){
// 找到目标值,而且不是自己本身
// 返回结果
return new int[]{n,i};
}
}
return new int[2];
}
}
这个方法效率会高很多很多,附上截图