給定乙個整數陣列nums
和乙個目標值target
,請你在該陣列中找出和為gai目標值的兩個整數。
你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9其實就這樣乙個最簡單的演算法題,給我的啟示卻很大因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解題思路:
使用hashmap做備忘錄,遍歷陣列中的每乙個元素,從map中查詢是否有target-nums[i],如果有就返回結果,如果沒有,就
map.put(nums[i],i) , 我們通過值為key查詢值所對應的index
public int twosum(int nums, int target) ;
}map.put(nums[i], i);
}throw new illegalargumentexception("no two sum solution");
}
這個我試過,通過最快5ms
後來我腦子有點抽,想用list去實現也可以啊,結果執行時間40ms
public int indexof(object o) else
return -1;
}
arraylist底層是陣列啊,這跟暴力的雙層迴圈出答案又有什麼兩樣呢 = =
於是我又想到了bitset
以及自己實現的二進位制,通過二進位制對應index上的1 or 0來判斷該數字在陣列中有沒有
結果會超出記憶體限制,總會存在 nums = [-9999999,9999999] ,target = 0 這樣的輸入
自己寫的沒有相應的擴容以及處理方式,還要處理負數的情況,十分麻煩,且儲存index也十分棘手
我一直忽略了hashmap為什麼會快,因為hash演算法使訪問的時間複雜度為o(1)
想要這個題執行速度比hashmap還快,實現乙個適合這個題的兒童版 "hashmap"
首先hash演算法的實現..
我們不知道測試的陣列裡面值是什麼,就當是隨機數,那既然是隨機數的話 取餘數,加法,乘法,除法,位運算等等都可以,
就直接和111111....做與運算好了
如果hash碰撞了,map裡是用鍊錶儲存,我們沒有必要,就用陣列儲存
用時2ms
下面是**
class solution ;
}int aimrootindex = root[aim & hash];
while (aimrootindex != 0) ;
}aimrootindex = linked[aimrootindex];
}int thisindex = self & hash;
linked[i] = root[thisindex];
root[thisindex] = i;
}return null;}}
1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 解class solution hash nums i...
1 兩數之和
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 由於元素不能重複利用,所以使用j i 1,通過雙迴圈,...
1 兩數之和
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。public int twosum int nums,int target throw new illegalargumentexception no two sum solution 這樣的時間複雜度為0 nlogn 但是通過檢視官方的...