1 兩數之和

2021-09-01 06:02:17 字數 1723 閱讀 1119

給定乙個整數陣列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 但是通過檢視官方的...