***有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。
1.直接暴力法
双层for循环遍历,先选中其中一个数,再依次对比后面的数与该数之和是否等于target,满足则输出数组下标。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] indexs = new int[2];
for(int i = 0; i < nums.length; i++){
for(int j = i+1; j < nums.length; j ++){
if(nums[i]+nums[j] == target){
indexs[0] = i;
indexs[1] = j;
return indexs;
}
}
}
return indexs;
}
}
时间复杂度 O(n^2);
空间复杂度 O(1)。
2.哈希表法
把所有元素放入哈希表,hashmap记住该元素以及该元素的索引,在哈希表中找到是否有target-x的元素,若有则输出两索引。
class Solution {
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 x=nums[i];
if (map.containsKey(target - x)) {
int index = map.get(target - x);
if (i != index ) return new int[]{i, index};
}
}
return new int[0];
}
}
时间复杂度 O(n);
空间复杂度 O(n)。