标签:
https://oj.leetcode.com/problems/two-sum/
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
public class Solution { public int[] twoSum(int[] numbers, int target) { int[] result = new int[2]; java.util.HashMap map = new java.util.HashMap(); for(int i = 0; i < numbers.length; i ++){ map.put(numbers[i], i); } for(int i = 0; i < numbers.length; i ++){ if(numbers[i] > target){ continue; } if(map.containsKey(target - numbers[i]) && (Integer)map.get(target - numbers[i]) != i){ result[0] = i+1; result[1] = (Integer)map.get(target - numbers[i]) + 1; return result; } } return result; } }
解题思路:
通过遍历两边数组的方法可以很容易求解,不过O(n^2),超时。
关键就在于借用hashmap,遍历数组每个数字,找另一个数字的时候,直接hasmap.get,时间复杂度为O(1),从而整个算法的时间复杂度就为O(n)了。
注意点:
考虑有重复元素,比如1,2,3,4,4。要求8。hashmap的value可以重复,key只能唯一。存入hashmap的时候,后面4的value会覆盖前面4的value。但对于本题不影响。因为只有唯一解,所以不存在有三个4的情况。所有遍历到第一个4,get的时候取出坐标5,一定得解了。
标签:
原文地址:http://www.cnblogs.com/NickyYe/p/4220931.html