两数之和
题目描述:
给定一个整数数组 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) 的算法吗?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力题解
public class Solution {
/**
* 两数之和,在数组中找到两个数,使得它们的和等于target,返回这两个数的下标(存于数组中返回)
*/
public int[] twoSum(int[] nums, int target) {
int index1 = -1, index2 = -1; // 可将答案1和答案2存在这两个变量中
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
index1=i;
index2=j;
break;
}
}
}
int[] ans = { index1, index2 };
return ans;
}
}
此常规算法运用两层for循环嵌套遍历,时间复杂度为O(n^2);
此常规算法中定义了index1和index2两个变量,而数组是通过形参传入,所以空间复杂度为O(1)。
优化题解(思路来自我的算法课程老师)
import java.util.HashMap;
public class SolutionPlus {
/**
* 两数之和,在数组中找到两个数,使得它们的和等于target,返回这两个数的下标(存于数组中返回)
*/
public int[] twoSum(int[] nums, int target) {
int index1 = -1, index2 = -1; // 可将答案1和答案2存在这两个变量中
//维护一个哈希表
int value=0;
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
value=nums[i];//下标i数值a
if(map.containsKey(target-value)){
//map.put(nums[i],i);
index1=i;//map.get(value)//只通过1个例子(第一版写的时候)
index2=map.get(target-value);
break;
}
else if(!map.containsKey(target-value)){
map.put(nums[i],i);
}
}
if(nums==null) return new int[0];
int[] ans = { index1, index2 };
return ans;
}
}
此优化算法用了一层for循环将数组元素加进哈希表map,再配合哈希表查询时花费O(1)的时间复杂度,使得优化算法的时间复杂度为O(n);
此优化算法除了定义了index1和index2两个变量外,还定义了一个哈希表,哈希表的长度由形参传入的数组来决定,此处可理解其长度为n,所以优化算法的空间复杂度为O(n)。
思考:为什么优化算法的时间复杂度可以比常规解法更快?
避免了两层循环嵌套的比对查询,哈希表是根据键而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度,理论上哈希表的时间效率为常数级别,即O(1)。
每当在数组中找到一个数a,便把数a作为key及其对应下标作为value存进哈希表;当我们检索到b时,也能快速地从哈希表中查到a = target - b是否存在。这样我们只需要遍历一次数组。
--------------------------------------本文章的题解均为本人作答,无抄袭,题目来源于力扣平台。----------------------------------------
标签:target,nums,--,题解,哈希,int,数组,index2,两数 From: https://www.cnblogs.com/hngz/p/16733042.html