題目: 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,你不能重覆利用這個數組中同樣的元素。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 ...
題目:
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重覆利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
答案:
1)暴力破解,遍歷每個元素 x,並查找後面是否存在一個值與 target−x 相等的目標元素。缺點:時間複雜度高
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 }View Code
2)通過迴圈遍歷兩次哈希表,第一次添加全部元素,第二次通過減去元素,查找另外一個是否在哈希表裡面。
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 }View Code
3)迴圈遍歷一次哈希表,每插入一個元素,查看哈希表裡面是否含有目標元素,及是否含有target-x,具體上代碼:
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 }View Code