【題目】
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
【思路】
方法一:暴力法
暴力法很簡單,只需要遍歷數組,查找是否存在target-nums[i]。時間複雜度
public static int[] twoSum(int[] nums,int target){
for (int i = 0; i < nums.length; i++) {
for (int j = i+1; j < nums.length; j++) {
if (nums[j]==(target-nums[i])){
return new int[] {i,j};
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
方法二:利用哈希表
- 遍歷數組nums,每個值判斷map中是否存在target-nums[i]的key。
- 如果存在則找到兩個值,返回數組下標,如果不存在將當前(nums[i],i)(存入map時,key:數組的值,value:對應的下標)存入map中,繼續遍歷,直到最後
- 如果最終沒找到,拋出異常
- 時間複雜度爲O(n)
public static int[] twoSum(int[] nums,int target){
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(target-nums[i])){
return new int[] {map.get(target - nums[i]),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum solution");
}