給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。javascript
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。java
Given an array of integers, return indices of the two numbers such that they add up to a specific target.數組
You may assume that each input would have exactly one solution, and you may not use the same element twice.函數
示例:ui
給定 nums = [2, 7, 11, 15], target = 9
由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]
複製代碼
暴力窮舉:外循環遍歷每一個元素 x
,內循環查找是否存在一個值與 target - x
相等的目標元素,返回相等的目標元素和 x 的索引。時間複雜度 O (n^2),效率過低,pass。spa
哈希表:哈希映射(map、dict),key 保存該元素,value 保存該元素索引。code
兩次遍歷法:第一次遍歷把全部元素及其索引保存到哈希映射,第二次遍歷查找 target - x
相等的目標元素cdn
一次遍歷法:假如 y = target - x
,則 x = target -y
,因此一次遍歷 在存入哈希映射的同時查找是否存在一個值與 target - x
相等的目標元素。對象
例:nums = [2, 11, 7, 15], target = 9, hashmap = { }
遍歷:
i = 0: target - x = 9 - 2 = 7, 7 不存在於 hashmap 中,則 x(2) 加入 hashmap, hashmap = {2 : 0}
i = 1: target - x = 9 - 11 = -2, -2 不存在於 hashmap 中,則 x(-2) 加入 hashmap, hashmap = {2 : 0, 11 : 1}
i = 2: target - x = 9 - 7 = 2, 2 存在於 hashmap 中,則返回列表 [2, 0]
複製代碼
兩次遍歷(Java):索引
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {//一次遍歷轉換成鍵值對,key爲元素值,value爲索引值
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {//二次遍歷查找符合條件的元素
int res = target - nums[i];
if (map.containsKey(res) && map.get(res) != i) {//查找到的目標元素不能爲其自己
return new int[]{i, map.get(res)};
}
}
return null;
}
}
複製代碼
一次遍歷 (Java):
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int res = target - nums[i];
if (map.containsKey(res)) {//由於自身元素還未加入到 hashmap,無需 map.get(res) != i 條件判斷
return new int[]{i, map.get(res)};
}
map.put(nums[i], i);//未找到目標元素則將其加入 hashmap
}
return null;
}
}
複製代碼
一次遍歷 (Python):
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic = {}
for i, num in enumerate(nums): #枚舉 nums 數組
if num in dic:
return [dic[num], i]
else:
dic[target-num] = i
複製代碼
利用 Python 數組自帶 index 方法解題:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i, num in enumerate(nums):
if target-num in nums and nums.index(target-num) != i:
return [i, nums.index(target-num)]
複製代碼
描述:
index () 函數用於從列表中找出某個值第一個匹配項的索引位置。
語法:
index () 方法語法:
list.index(x, start, end)
複製代碼
參數:
返回:
該方法返回查找對象的索引位置,若是沒有找到對象則拋出異常。
歡迎關注微.信.公.衆號: 愛寫Bug