题目描述:
解方法1:暴力枚举法
没错,我想出来的也是这一种方法,就是最笨的,暴力枚举求解法
java代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
int []list = new int[2];
for(int i = 0; i < nums.length; i++) {
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
int j = nums.length - 1;
while(i < j && nums[i] + nums[j] != target) {
j--;
}
if(i == j) {
continue;
}
if(nums[i] + nums[j] == target) {
list[0] = i;
list[1] = j;
}
}
return list;
}
}
执行用时惨不忍睹
时间复杂度:O(n²)
空间复杂度:O(1)
方法2:哈希表
这个是评论区给出的答案,确实不错,使用java中的HashMap,将<Key,Value>保存到哈希表中,key保存数值,value为下标,这样我们寻找 target - x
的时间复杂度降低到从 O(N)降低到 O(1)
我们创建一个哈希表,对于每一个 x
,我们首先查询哈希表中是否存在 target - x
,然后将 x
插入到哈希表中,即可保证不会让 x
和自己匹配。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
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);
}
return new int[0];
}
}
时间复杂度:O(n)
空间复杂度:O(n)