法一:Brute Force
# Python
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)-1):
for j in range(i,len(nums)):
if nums[j] == target - nums[j]:
return [i,j]
Time Complexity:
O
(
n
2
)
O(n^2)
O(n2)
Space Complexity:
O
(
1
)
O(1)
O(1)
法二: Two-pass Hash Table
第一遍:将元素加入Hash Table
第二遍:对每个
x
x
x, 查看是否有 target -
x
x
x
// Java
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
map.put(nums[i],i);
}
for(int i = 0; i < nums.length; i++){
int complement = target - nums[i];
if(map.containsKey(complement) && map.get(complement) != i){
return new int[] {i, map.get(complement)};
}
}
throw new IllegalArgumentException("No two sum solution");
}
Time Complexity:
O
(
n
)
O(n)
O(n)
Space Complexity:
O
(
n
)
O(n)
O(n) (Depends on the number of items stored in the hash table)
法三: One-pass Hash Table
在将元素 x x x加入Hash Table的同时,比较在已加入的元素中有无 target - x x x。
//Java
public int[] twoSum(int[] nums, int target){
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int complement = target - nums[i];
if(map.containsKey(complement)){
return new int[] {i,map.get(complement)};
}
map.put(nums[i],i);
}
return new IllegalArgumentException("No two sum solution");
}
# Python
myDict = {}
for i in range(len(nums)):
compliment = target - nums[i]
if compliment in myDict:
return myDict[compliment], i
myDict[nums[i]] = i
Time Complexity:
O
(
n
)
O(n)
O(n)
Space Complexity:
O
(
n
)
O(n)
O(n)