两数之和 — Java
题目如图所示:
看到这个题目的第一眼,内心不屑的说了一声切,简直侮辱我智商
然后呢,本着我很强,但是也还是要做的心情,三下五除二写了两个for循环
一顿操作,执行代码,提交,一气呵成
老天是公平的,他不会让你得瑟很久的
运行结果一出来
what?????
怎么可能,才50%!!
哇,这也太太太太太打击人了吧,怎么前面的能够这么多!!
咱好歹也是学过数据结构的,不行,去 抄抄 借鉴一下他们的先
就那个最前面的吧,看着就很强的亚子
看这代码
看这结构
实在是。。。。
妙啊!!!
其实这个题目的难点在于找到那个数,找数无非就是遍历,然后判断,程序耗时也就是消耗在遍历这里,看了一下其他的题解,大多用到了 HashMap.
而这里使用的是一种类似于自己创建一个简单的哈希表的方法,indexArrays为那个哈希表,indexArrays中存放的其实是nums中元素的位置
其中的diff & indexArrayMax
,一是为了解决可能存在的负数的情况,二是为了解决nums中数值过大的情况,& indexArrayMax
能够使nums中无论是什么数都能被约束到0-2047之间。
总的来说,这样做是比java自带的hashmap要快一点,但是思路是一样的
至于哈希表是什么意思。。。
翻书去!!!
用时1ms
class Solution {
public int[] twoSum(int[] nums, int target) {
int indexArrayMax = 2047;
int[] indexArrays = new int[indexArrayMax + 1];
for (int i = 0; i < nums.length; i++) {
int diff = target - nums[i];
int index = diff & indexArrayMax; //控制下标索引始终为正
if (indexArrays[index] != 0) {
return new int[] { indexArrays[index] - 1, i };
}
indexArrays[nums[i] & indexArrayMax] = i + 1;
}
throw new IllegalArgumentException("No two sum value");
}
}
leetcode官方方法
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
int left = target - nums[i];
if(map.containsKey(left)){
return new int[]{map.get(left),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum value");
}
}
恬不知耻的把自己的也放上来
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] c = new int[2];
for(int a=0;a<nums.length;a++){
for(int b=a+1;b<nums.length;b++){
if(nums[a]+nums[b] == target){
c[0] = a;
c[1] = b;
}
}
}
return c;
}
}