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]; 也不能遗漏,否则编译错误。不光这题,所有题都要确保方法必然有一个正确类型的返回值

 

posted @ 2019-04-08 13:31  末夏始秋  阅读(94)  评论(0编辑  收藏  举报