两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
这是我刷题的开始也是我遇到的比较简单的算法题
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] a=new int[2];
for(int i=0;i<nums.length; i++){
for(int j=0;j<nums.length-i-1;j++){
if(target==nums[i]+nums[i+j+1]){
a[0]=i;
a[1]=i+j+1;
}
}
}
return a;
}
}
我写的比较少但是对计算机的运算比较多
这是我多这道的编程算法其中的IllegalArgumentException是我看到网上的操作弄的,具体表示构造不带详细消息的IllegalArgumentException
但是感觉有点浪费运行时间,其中涉及到的算法也比较简单,然后我就去找了大神是怎么写的:用的是哈希表的方法
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();//
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);//将数组的值和数组的下标对应
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];//判断数组中的每一个元素对应的另一个值
if (map.containsKey(complement) && map.get(complement) != i) {//判断数组中是否有该补值是不是其补值不是其自身
return new int[] { i, map.get(complement) };//返回数组
}
}
throw new IllegalArgumentException("No two sum solution");//没有两个和解
}
}
用哈希表的方法看起来比较复杂,但其实就是将数组值和对应数组值的下标的映射存在一个对象中然后然后判断对象中有没有该数组中的补值如果有就将其取出.
这其中涉及到的方法
containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。更确切地讲,当且仅当此映射包含针对满足 (keynull ? knull : key.equals(k)) 的键 k 的映射关系时,返回 true。(最多只能有一个这样的映射关系)。
get(Object key):
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
更确切地讲,如果此映射包含满足 (keynull ? knull : key.equals(k)) 的键 k 到值 v 的映射关系,则此方法返回 v;否则返回 null。(最多只能有一个这样的映射关系)。
如果此映射允许 null 值,则返回 null 值并不一定 表示该映射不包含该键的映射关系;也可能该映射将该键显示地映射到 null。使用 containsKey 操作可区分这两种情况。