题目:
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].
解答:
Java解法一:
public class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
int[] res = new int[2];
for (int i = 0; i < nums.length; ++i) {
m.put(nums[i], i);
}
for (int i = 0; i < nums.length; ++i) {
int t = target - nums[i];
if (m.containsKey(t) && m.get(t) != i) {
res[0] = i;
res[1] = m.get(t);
break;
}
}
return res;
}
}
其中,一开始的常规想法是,HashMap中,key存储索引值,value存储nums[i]值,但在根据value值获取key索引值时较为复杂。所以应该转换思维,让HashMap中key存储nums[i]值,value存储索引值。这样便于通过数值获取对饮数组中的索引位置。
Java解法二:
public class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
int[] res = new int[2];
for (int i = 0; i < nums.length; ++i) {
if (m.containsKey(target - nums[i])) {
res[0] = i;
res[1] = m.get(target - nums[i]);
break;
}
m.put(nums[i], i);
}
return res;
}
}
解法一扫描了原数组两次,其实只要稍微改动一下,把两个for循环合并成一个,就可以只扫描原数组一次了。(因为a+b=target中,先找到a和先找到b的性质是一样的。)
解析:
- 我们只想用线性的时间复杂度来解决问题,那么就是说只能遍历一个数字,那么另一个数字呢,我们可以事先将其存储起来,使用一个HashMap,来建立数字和其坐标位置之间的映射,我们都知道HashMap是常数级的查找效率,这样,我们在遍历数组的时候,用target减去遍历到的数字,就是另一个需要的数字了,直接在HashMap中查找其是否存在即可,注意要判断查找到的数字不是第一个数字,比如target是4,遍历到了一个2,那么另外一个2不能是之前那个2,整个实现步骤为:先遍历一遍数组,建立HashMap映射,然后再遍历一遍,开始查找,找到则记录index。
- HashMap的put方法
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
String p1 = map.put("11", "22");
System.out.println("p1:" + p1);
String p2 = map.put("33", "44");
System.out.println("p2:" + p2);
String value1 = map.get("11");
System.out.println("value1:" + value1);
String p3 = map.put("11", "44");
System.out.println("p3:" + p3);
String value2 = map.get("11");
System.out.println("value2:" + value2);
}
}
输出结果:
p1:null
p2:null
value1:22
p3:22
value2:44
说明:put方法返回值为null或者value;如果key没有重复,put成功,则返回null,如p1、p2;如果key重复了,返回的是map.get(key),也就是当前这个key对应的value,如上面的p3,key=“11”,而p1的key也是"11",p1与p3重复,返回的是p1的value=“22”,并且将p3覆盖掉p1