这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战。
描述
给定一个整数数组 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]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
做题
这道题比较简单。
时间复杂度 O(n^2) 的解法就是,先确定一个数,然后去和后面的数一个个相加,看看和是不是 target,需要双层循环。
时间复杂度为 O(n) 的解法太简单了。我们需要使用 map,遍历的时候从 使用 target 减去当前的数,找找 map 中有没有差,有的话就是找到了两个数,没有的话就把值作为 key,下标作为 value 存进 map 中。这样就能一次循环就完成了。
上代码!
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
Integer integer = map.get(target - num);
if (integer!=null){
//找到了
return new int[]{i,integer};
}
//存进 map
map.put(num,i);
}
return null;
}
easy!
最后
做完这道题,感觉回到了大学,力扣的数据结构题貌似都是大学课本上有的,以前没有好好学的东西,现在就要来补了。
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。