題目:給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。(你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。)
示例:給定 nums = [2, 7, 11, 15], target = 9,返回 [0, 1],因為 nums[0] + nums[1] = 2 + 7 = 9
方法一:暴力迴圈,時間複雜度o(n²),空間複雜度o(1)
classsolution ;}}
}//如果不存在返回乙個空的陣列
return
newint[0];
}}
方法二:使用雜湊表將時間複雜度降到o(n),空間複雜度也因此變為o(n)。在方法一中,使用外層迴圈時間複雜度為o(n),內層迴圈遍歷查詢值為target-nums[i]的元素,如果這個查詢過程的時間複雜度簡化為o(1),那麼整體的時間複雜度就是o(n)。
classsolution ;
}//將當前的nums[i]放入map,供後面查詢
map.put(nums[i], i);
}//如果不存在返回乙個空的陣列
return
newint[0];
}}
解析:為什麼雜湊表查詢key的時間複雜度是o(1)?
雜湊表也叫雜湊表,它通過key值計算直接得到儲存在記憶體中的位置,計算的函式就叫雜湊函式,即y=f(key)。就好像根據陣列下標去獲取元素一樣,如果知道了陣列的首位址,那麼其他元素的位址都可以通過下標計算得來,所以用陣列下標獲取陣列元素的時間複雜度是o(1)。而如果只知道元素的值不知道下標,那麼陣列的查詢時間複雜度也是o(n),因為要遍歷陣列進行元素值的比較;而雜湊表相當於直接通過key的值計算得到它的下標位置了,因此時間複雜度為o(1)。
以**中使用的hashmap為例,它的底層採用的是陣列+鍊錶+紅黑樹,首先通過key的雜湊值對陣列長度取餘,得到key-value存放在陣列中的位置,如果這個位置已經有其它值了(即發生了雜湊衝突),那麼在當前位置再延伸出乙個鍊錶繼續存放,再往下為了提高查詢效率又加入了紅黑樹。
總而言之,雜湊表的查詢時間複雜度為o(1)是因為它可以通過key值直接計算得到儲存位置,而不需要去遍歷乙個乙個比較key值是否相等(時間複雜度為o(n)的方式)。
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 但是通過檢視官方的...