1. Two Sum

题目:给定一个整型数组,返回两个数的下标,满足两个数相加为一个特定整数。假定只有一个正确答案

例如:

nums = [2, 7, 11, 15], target = 9,因为nums[0] + nums[1] = 2 + 7 = 9,返回[0,1]

思路:如果是只返回两个数,可以将数组排序后,从两边(left=0,right=length-1)往中间依次取数。如果总和大于target,right--,否则right++;直到left大于等于right停止。

但本题要求返回索引,所以需要用一个map来记录每个数字出现的位置

解法1:

 1     public int[] test_1(int[] nums, int target) {
 2         int[] result = new int[2];
 3         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
 4         for (int i = 0; i < nums.length; i++) {
 5             if (map.containsKey(target - nums[i])) {
 6                 result[1] = i;
 7                 result[0] = map.get(target - nums[i]);
 8                 return result;
 9             }
10             map.put(nums[i], i);
11         }
12         return result;
13     }

 

解法2:

 1     public int[] twoSum(int[] nums, int target) {
 2         if(nums == null || nums.length == 0)
 3             return null;
 4         Map<Integer,List<Integer>> numberMap = new HashMap<>();
 5         for (int i=0;i<nums.length;i++)
 6         {
 7             List<Integer> indexs = numberMap.getOrDefault(nums[i],new ArrayList<>());
 8             indexs.add(i);
 9             numberMap.put(nums[i],indexs);
10         }
11 
12         for (Map.Entry<Integer,List<Integer>> e:numberMap.entrySet())
13         {
14             if (numberMap.containsKey(target - e.getKey()))
15             {
16                 if (target - e.getKey() == e.getKey())
17                 {
18                     continue;
19                 }
20                 return new int[]{e.getValue().get(0),numberMap.get(target - e.getKey()).get(0)};
21             }
22         }
23         List<Integer> p = numberMap.get(target/2);
24         if(p == null) return null;
25         return new int[]{p.get(0),p.get(1)};   
26     }

 

posted @ 2017-10-14 19:44  daniel456  阅读(126)  评论(0编辑  收藏  举报