Java
方法一 枚举法
思路:
采用双层循环遍历数组中的元素,找到符合题目要求的两数即可,若找不到则抛出异常。
代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
int i,j;
int len = nums.length;
for(i = 0;i < len; i++){
for(j = i+1;j < len; j++){
if(nums[i]+nums[j] == target){return new int[] {i,j};}
}
}
throw new IllegalArgumentException("no two numbers qualified");
}
}
方法一很容易想到,也很容易理解,但是该方法时间复杂度为 O ( n 2 ) O(n^2) O(n2),我们希望减少一些时间复杂度,于是有了第二个方法。
方法二 使用哈希表
思路:
方法一中对于每一个
n
u
m
s
[
i
]
nums[i]
nums[i],都要再花费时间遍历剩下的元素来寻找
t
a
r
g
e
t
−
n
u
m
s
[
i
]
target - nums[i]
target−nums[i],这就导致了最终
O
(
n
2
)
O(n^2)
O(n2)的时间复杂度,这就促使我们思考:有没有什么方法可以快速寻找
t
a
r
g
e
t
−
n
u
m
s
[
i
]
target - nums[i]
target−nums[i]?我们于是把目光投向了哈希表这一数据结构。
步骤:
- 建立一个初始长度为 n − 1 n-1 n−1的哈希表;
- 把 n u m s [ 0 ] nums[0] nums[0]放入;
- 遍历数组中的元素;
- 对任意一个元素,若 t a r g e t − n u m s [ i ] target - nums[i] target−nums[i]在哈希表中,则直接返回(这里用 t e m p temp temp表示 t a r g e t − n u m s [ i ] target - nums[i] target−nums[i]),
- 若 t a r g e t − n u m s [ i ] target - nums[i] target−nums[i]不在哈希表中,则将这个元素放入哈希表;
- 遍历完成后,若没有符合条件的两数,则抛出异常
public static int[] twoSum(int[] nums, int target) {
int n = nums.length;
Map<Integer,Integer> hashtable = new HashMap<Integer,Integer>(n-1);
int i;
hashtable.put(nums[0],0);
for(i = 1;i < n; i++){
int temp = target - nums[i];
if(hashtable.containsKey(temp)) {
return new int[] {i,hashtable.get(temp)};}
hashtable.put(nums[i],i);
}
throw new IllegalArgumentException("no two numbers qualified");
}
}
由于哈希表查找速度为 O ( 1 ) O(1) O(1),所以该方法是 O ( n ) O(n) O(n)的。