題目:html
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。數組
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。ide
示例:spa
給定 nums = [2, 7, 11, 15], target = 9code
由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]htm
答案:blog
1)暴力破解,遍歷每一個元素 x,並查找後面是否存在一個值與 target−x 相等的目標元素。缺點:時間複雜度高get
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 for (int i = 0; i < nums.length; i++) { 4 for (int j = i + 1; j < nums.length; j++) { 5 if (nums[j] == target - nums[i]) { 6 return new int[] { i, j }; 7 } 8 } 9 } 10 throw new IllegalArgumentException("No two sum solution"); 11 } 12 }
2)經過循環遍歷兩次哈希表,第一次添加所有元素,第二次經過減去元素,查找另一個是否在哈希表裏面。io
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 Map<Integer, Integer> map = new HashMap<>(); 4 for (int i = 0; i < nums.length; i++) { 5 map.put(nums[i], i); 6 } 7 for (int i = 0; i < nums.length; i++) { 8 int complement = target - nums[i]; 9 if (map.containsKey(complement) && map.get(complement) != i) { 10 return new int[] { i, map.get(complement) }; 11 } 12 } 13 throw new IllegalArgumentException("No two sum solution"); 14 } 15 }
3)循環遍歷一次哈希表,每插入一個元素,查看哈希表裏面是否含有目標元素,及是否含有target-x,具體上代碼:event
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 Map<Integer, Integer> map = new HashMap<>(); 4 for (int i = 0; i < nums.length; i++) { 5 int complement = target - nums[i]; 6 if (map.containsKey(complement)) { 7 return new int[] { map.get(complement), i }; 8 } 9 map.put(nums[i], i); 10 } 11 throw new IllegalArgumentException("No two sum solution"); 12 } 13 }