给出一个数组和一个目标值,如果数组中任意两个数字的加和等于目标值,输出这两个位置

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类型的数值

 

在Java中,哈希码代表对象的特征。
例如对象 String str1 = “aa”, str1.hashCode= 3104
String str2 = “bb”, str2.hashCode= 3106
String str3 = “aa”, str3.hashCode= 3104
根据HashCode由此可得出str1!=str2,str1==str3
下面给出几个常用的哈希码的算法。
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

 

 

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,然后返回

 

以上是关于给出一个数组和一个目标值,如果数组中任意两个数字的加和等于目标值,输出这两个位置的主要内容,如果未能解决你的问题,请参考以下文章

leetcode答案两数之和(two sum)

CSDN|每日一练查找整数

CSDN|每日一练查找整数

输入一个已经按升序排序的数组和一个数字 ,在数组中查找两个数,使得他们的和是输入的那个数字

two-sum

和为S的两个数字