leetcode 1 two sum
非常经典的一道题,就像单词书的第一个永远都是abandon一样。
思路:
由于不是有序的数组,所以不建议用two pointers来做。leetcode 167就可以用two pointers。
这里直接借助map容器即可。即建立一个值和下标之间的映射。
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 Map<Integer, Integer> hm = new HashMap<>(); 4 for (int i = 0; i < nums.length; i++) { 5 if (hm.containsKey(target - nums[i])) { 6 return new int[]{hm.get(target - nums[i]), i}; 7 } 8 hm.put(nums[i], i); 9 } 10 return new int[0]; 11 } 12 }
有两个注意的地方:
1. map这里是区别不了两个同样(整数)值的keys的,因为Integer重写了equals方法,值一样就算一样。但在这里不影响什么,因为这里我们从前往后遍历整个数组,即就算值相同,那它们也必然不会是同一个元素。这点很重要。
2. 比较容易犯的一个错误是漏了写返回值。虽然题目说有且只有一个解,但是最后的 return new int[0]; 也不能遗漏,否则编译错误。不光这题,所有题都要确保方法必然有一个正确类型的返回值。