两数之和-力扣
第一种方法
class Solution {
public int[] twoSum(int[] nums, int target) {
int list[]=new int[2]; //存储返回的两个下标
int target1;
for(int i=0;i<nums.length;i++){
target1=target-nums[i]; //存储一个差值
for(int j=i+1;j<nums.length;j++){
if(target1==nums[j]){ //判断差值是否在nums数组中
list[0]=i;
list[1]=j;
return list;
}
}
}
return new int[0];
}
}
复杂度分析
*复杂度分析
*时间复杂度:O(N^2),其中 NN 是数组中的元素数量。最坏情况下数组中任意两个数都
要被匹配一次
*空间复杂度:O(1)
第二种方法
*通过哈希表存储数组值和数组值对应的下标,每一次遍历数组nums时,判断target-nums[i]是否存在哈希表中,如有,return new int[]{map.get(target-nums[i]),i},否则添加(nums[i],i)键值对到哈希表中
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 new int[2];
}
}
复杂度分析
*复杂度分析
*时间复杂度:O(N),其中 NN 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地
寻找 target - nums[i].
*空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。