小白刷题时学习的一些解法思路及分析,如果有不对的地方可以在评论区指出或私聊,侵删
一、题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
二、解题方法即代码详解
解法一:枚举法
解题思路:
使用两个for循环分别使用int型的变量记录数组下标,在if条件语句下进行判断对应两数值的和是否为答案,不相等继续调用循环语句,相等反馈输出结果。
java:
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0; i < nums.length; i++){
for(int j = i + 1; j < nums.length; j++){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
}
return new int[0];
}
}
语句详解:
for(int i = 0; i < nums.length; i++){
创建一个新的变量i,初始化为0,当i小于数组长度时,进入循环语句,每执行完一次循环,对i进行自加操作,使第一个指针沿数组向前移动一位。
for(int j = i + 1; j < nums.length; j++){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
内部循环创建一个新的变量j(因为不可使用同一个元素两次,即i!=j,且当j始终在i之后时,可减少重复运算)=i+1,当j小于数组长度时,进入循环,循环内有一个if判断语句,如果nums[i]+nums[j]的值与目标值相等,则执行return new int[]{i,j};,即返回一个新的数组,数组内包含所需的两个下标i和j。
当最外层的for循环均执行完后,依旧无法得到所需数组的下标,则返回一个新的空数组。
该解法使用了两层嵌套的for循环,其时间复杂度为O(n^2),空间复杂度仅开辟了两个变量,空间复杂度为O(1).
解法二:哈希查找法
后续会出一篇文章单独记录哈希表的内容,目前仅介绍当前所需使用的方法:
//新建一个HashMap对象
Map<String,Object> map = new HashMap<>();
//向map中添加键值对
map.put("key", value);
//从map中查找key并返回对应的value值
map.get("key");
或可前往菜鸟教程学习相关知识:Java HashMap | 菜鸟教程 (runoob.com)
解题思路:
创建一个哈希图,使用一个参数i作为数组下标,使用nums[i] = target-nums[x](nums[x]为目标与当前值的差)作为key值,对应的value值为i,使用哈希表每次查找的key即target-nums[i],实质上为当前nums[i]与目标的差。未查找到时将当前值插入哈希表中,查找成功则输出对应的两个数值下标(map.get(nums[i])对应的value值即为前一个数组下标。)
java:
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map=new HashMap<>();
for(int i = 0; i < nums.length; i++){
if(map.get(nums[i]) != null)
return new int[]{map.get(nums[i]), i};
else
map.put(target - nums[i], i);
}
return new int[0];
}
}
语句详解:
HashMap<Integer,Integer> map=new HashMap<>();
该语句新建了一个空的哈希图,键及值对应的类均为int。
for(int i = 0; i < nums.length; i++){
if(map.get(nums[i]!=null)
return new int[]{map.get(nums[i]),i};
else
map.put(target-nums[i],i);
}
return new int[0];
for循环创建并初始化了一个新的变量i为0,当i小于数组长度时,进入循环,判断map图中是否有怒nums[i](即target-nums[x]的对应的键。),如果不存在,map.get(nums[i])返回null则将键值对[target-nums[i], i]放入哈希表中。当查找成功时,则创建一个新的数组,返回nums[i]作为key对应的value(数组下标),和i。如果循环跑完依然没有得到目标,则返回一个空的新数组。
时间复杂度为O(n): 最差情况for循环运行n次,每次哈希查找一次为O(1)
空间复杂度为O(n): 最差情况一个i,哈希图中n个数组和其下标组成的键值对。
如果你在阅读过程中发现错误或不懂的地方,可以在评论去中指出或私聊,感谢阅读。