兩數之和 — 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;
}
}