給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。java
示例:數組
給定 nums = [2, 7, 11, 15], target = 9 由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]
<!--more-->spa
target
(固然這估計過不了關)HashMap
有個get
方法效率很高,那麼首先把數組中全部元素put
到map
中,將target - nums[i]
做爲key,索引index
做爲value
,那麼再寫一個循環去遍歷數組時候,判斷起來就很方便了。map.get(nums[i])
,便可拿到對應的value
,當value
不爲null
的時候證實知足了nums[i] + nums[j] = target
,也就是nums[i] = target - nums[j]
。如上面示例的話,map中會存放的是map:{7:0, 2:1, -2:2, -6:3}
int b = map.get(nums[i])
不爲空 且b != i
時<font color=grey size=2>(由於當nums[0]==3
,target==6
就會獲得[0,0],很顯然這是錯誤的,題目中提到了不能重複利用這個數組中一樣的元素)</font>,便可break
,[i,b]
就是答案
put
到map
中(key,value
同上),循環過程當中再去判斷是否map
已經contains
這個nums[i]
了,若是包含則知足了nums[i] = target - nums[j]
,便可以break
上面都將 $ O(n^2)->O(n) $code
package com.dasnnj.practice.simple; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * Description <p> TODO: * 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。 * 你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。 * <p> * 示例: * <p> * 給定 nums = [2, 7, 11, 15], target = 9 * <p> * 由於 nums[0] + nums[1] = 2 + 7 = 9 * 因此返回 [0, 1]</p> * * @author DASNNJ <a href="mailto:dasnnj@outlook.com"> dasnnj@outlook.com </a> * @date 2019-04-28 15:38 */ public class TwoSum { static int[] twoSum(int[] nums, int target) { //One /*//key爲target-nums[i],value爲index Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { map.put(target-nums[i],i); } int[] res = new int[2]; for (int i = 0; i < nums.length; i++) { Integer b; if ((b = map.get(nums[i])) != null && b != i) { res[0] = b; res[1] = i; break; } } return res; */ //Two //key爲target-nums[i],value爲index Map<Integer, Integer> map = new HashMap<>(); int[] res = new int[2]; for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { res[0] = map.get(nums[i]); res[1] = i; break; } map.put(target - nums[i], i); } return res; } public static void main(String[] args) { int[] nums = new int[]{2, 7, 11, 15}; System.out.println(Arrays.toString(TwoSum.twoSum(nums, 9))); } }