梦开始的地方
一、暴力枚举
首先想到的必然是两个for循环暴力呀
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] ret = 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) {
ret[0] = i;
ret[1] = j;
break;
}
}
}
return ret;
}
}
时间复杂度:O(N²)
空间复杂度:O(1)
二、哈希表
- 对于那么高的时间复杂度,我们可以通过哈希表的时间复杂度为O(1),利用哈希容器map降低时间复杂度
- 遍历数组nums,i为当前下标,每个值都判断map中是否存在target-nums[i]的key值
- 如果存在则找到了两个值,如果不存在则将当前的(nums[i],i)存入map中,继续遍历直到找到位置
- 如果最终都没有结果则返回为空
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
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 null;
}
}
时间复杂度:O(N)
空间复杂度:O(N) 主要是因为哈希表开销