给出一个数组和一个目标值,如果数组中任意两个数字的加和等于目标值,输出这两个位置
Posted 孜然风味
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给出一个数组和一个目标值,如果数组中任意两个数字的加和等于目标值,输出这两个位置相关的知识,希望对你有一定的参考价值。
一般的做法(我自己也这样做了哈哈)
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[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
O(n?2??)
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");
}
这种方法利用了map的特性,不用双重循环,降低了复杂度O(n)
这个更绝。。。既往前走,又往后回顾!!
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Map集合中不应该利用get(Object key)方法来判断是否存在某个键,而应该利用containsKey()方法来判断,containsKey方法用来判断Map集合对象中是否包含指定的键名。
语法 boolean containsKey(Object key)
返回值:如果Map集合中包含指定的键名,则返回true;否则返回false。
参数:key是要查询的Map集合的键名对象。
get方法
同样当key为null时会进行特殊处理,在table[0]的链表上查找key为null的元素
get的过程是先计算hash然后通过hash与table.length取摸计算index值,然后遍历table[index]上的链表,直到找到key,然后返回
以上是关于给出一个数组和一个目标值,如果数组中任意两个数字的加和等于目标值,输出这两个位置的主要内容,如果未能解决你的问题,请参考以下文章