题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
来源:力扣(LeetCode)
链接:两数之和
version-1(菜的安详):
class Solution {
int[] find = new int[2];
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) {
find[0]=i;
find[1]=j;
break;
}
}
}
return find;
}
}
**version-1心路历程:**我刚开始第一想法就是暴力解法,看到哈希表毫无想法。而且我刚开始还加了个二维数组用来存放所有的相加的可能(MATLAB写多了),然后发现LeetCode提交系统中的测试样本很大时,会报错说我超出了系统内存限制(这很明显是无事生非,显然我们必须尽量避免使用高维数组,占内存)
version-2:Hashmap学习:
(创建一个hashmap容器存放已经判断的数,并用来与新取出的数比较是否有希望和为目标值,没有希望将这个新的数也加入到hashmap中)
具体的实现逻辑:
//先初始化存入第一对键值
//从存放第二对键值时,开始检查容器内的已有键值对–有没有能够与此时打算新加入的键值对–相加成为target的键值
//如果有,则返回相应的键(数组元素值)—值(数组的序号)
//如果没有, 则单纯的存入相应的新的键值对至容器内
//如此循环往复,直到出现target的匹配对,否则直到所有nums数组的元素全部存入map容器中;此时也就相当于:我们最终没有找到一对合适的sumTwo ,最后可以抛出一个错误(我的理解是:因为你一定要返回一个值,你这个方法不是void,所以必须return,如果遍历完所有后,发现不能return一对index时,此时只能你自己先报错告诉用户内没有找到,并终止程序-----throw错误后的程序没法执行。你会发现:如果你的target真的没有找到一对index,你没有throw这个错误,此时相当于你缺少个return语句,系统编译也会报错。)
Map类方法1:get(Object key)--------获取相应键的值
Map类方法2: put(K key, V value)------------在容器中存入一对键值
Map类方法3:containsKey(key:)-------键在容器与否(返回boolean值:true or false )
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
int cp=target-nums[i];
if(map.containsKey(cp)){
return new int[]{map.get(cp),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("报错:没有这个组合");
}
}