LeetCode之两数之和超详细java讲解

描述:给定一个整数数组nums和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。(具体要求请参考下面链接https://leetcode-cn.com/problems/two-sum/)

思路一:当然是暴力...暴力...暴力求解啊,列举所有的可能。

时间复杂度 O(n^2)  这里n为数组的长度
空间复杂度 O(1)   只用的常数个临时变量

public int[] twoSum(int[] nums,int target){
int[] result = new int[2]; //创建一个result数组
for(int i = 0;i<nums.length;i++){ //两层循环暴力枚举求解
for(int j = i+1;j<nums.length;j++){
if(nums[i] + nums[j] == target){ //判断是否符合题目要求
result[0] = i;
result[1] = j;
}
}
}
return result; //返回数组
}

 but...参考别人真正的算法时才明白自己是个超级小丑。。。。。

 

思路二:因为方法一的寻找时间复杂度过高,利用HashMap查找时间复杂度为O(1)。利用查找表法,在遍历的同时记录,以空间换时间。

     例如数组中的值为{2,6,9} target=11 则开始执行map.put(nums[0],0) 此时map值为{[2,0]}(key为nums[i]的值,value为值得下标),

     第二步执行判断语句target-nums[1] = 5,不存在即存入map中,此时map值为{[2,0],[6,1]}

     第三步执行判断语句target-nums[2] = 2,此时map中存在key=2的,故赋值给result然后跳出,完成

 

时间复杂度:O(n) n为数组的长度,每次需要O(1)次寻找,所以总的时间复杂度为O(n)

空间复杂度:O(n) n为数组的长度,主要是HashMap的开销

public int[] twoSum2(int[] nums, int target) {
int[] result = new int[2]; //创建一个结果数组
HashMap<Integer, Integer> map = new HashMap<>(); //创建一个HashMap表
map.put(nums[0], 0); //因为数组的第一个值一定没有与之相同的值
for (int i = 1; i < nums.length; i++) {
if (map.containsKey(target - nums[i])) {
result[0] = i;
result[1] = map.get(target - nums[i]);
break; //找到对应值立即跳出循环(题目已知有且只有一对正确答案)
}
map.put(nums[i], i); //只要没找到,就一直put哈希表中
}
return result;
}

 

                                             2021-05-24

-

posted @ 2021-05-24 22:00  华sam  阅读(275)  评论(0编辑  收藏  举报