給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。java
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。數組
示例:code
給定 nums = [2, 7, 11, 15], target = 9
由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]leetcode
LeetCode 有題解和分析, 參看LeetCodeget
使用一個 HashMap
保存數組, key爲數組元素值, value爲其下標. 而後循環數組併爲map填充, 在填充以前斷定 target-num[i] 的值是否在map中存在, 存在則匹配到了須要的值. 並從map中取到其下標.io
由於只遍歷一次, 因此時間複雜度和空間複雜度均爲 O(n) .class
public class TowSum { public int[] twoSum(int[] nums, int target) { if (nums==null||nums.length<2){ return new int[]{-1,-1}; } int [] rs = new int[]{-1,-1}; Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(target-nums[i])){ rs[0] = map.get(target-nums[i]); rs[1] = i; break; } map.put(nums[i],i); } return rs; } public static void main(String[] args) { int[] nums = new int[]{2,5,8,7,9,4}; int [] rs = new TowSum().twoSum(nums,17); System.out.println(Arrays.toString(rs)); } }