力扣1 兩數之和

2022-03-29 10:22:24 字數 1825 閱讀 3425

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因為 nums[

0] + nums[1] = 2 + 7 = 9

所以返回 [

0, 1

]

遍歷每個元素 xx,並查詢是否存在乙個值與 target - xtarget−x 相等的目標元素。

1

class

solution ;8}

9}10}

11return

null;12

}13 }

時間複雜度為o(n^2),空間複雜度為o(1)

兩次hashmap,第一次把所有元素都加入到map中,第二次掃瞄nums陣列,判斷互補元素是否存在於map中,注意該目標元素不能是 nums[i]nums[i] 本身!

1

class

solution 9//

掃瞄nums陣列,判斷互補元素是否存在於map中

10for(int i = 0; i < nums.length; i++);14}

15}16return

null;17

}18 }

時間複雜度:o(n)o(n),

我們把包含有 nn 個元素的列表遍歷兩次。由於雜湊表將查詢時間縮短到 o(1)o(1) ,所以時間複雜度為 o(n)o(n)。

空間複雜度:o(n)o(n),

所需的額外空間取決於雜湊表中儲存的元素數量,該表中儲存了 nn 個元素。

1. 借助乙個hashmap, 儲存的元素是乙個nums[i] 和 i

2. 遍歷所有的元素,對於每個元素判斷互補的那個元素是否在map中,如果在根據互補的值作為鍵取出鍵值對,返回陣列,退出迴圈

3.  如果不在,則將當前元素和下標作為鍵值對新增到map中

1

class

solution ;

9 }else12}

13return

null;14

}15 }

時間複雜度:o(n)o(n),

我們只遍歷了包含有 nn 個元素的列表一次。在表中進行的每次查詢只花費 o(1)o(1) 的時間。

空間複雜度:o(n)o(n),

所需的額外空間取決於雜湊表中儲存的元素數量,該錶最多需要儲存 nn 個元素。

1. hashmap的containskey()函式的演算法複雜度是o(1), 不是o(n),更不是o(n^2), 所以使用了hashmap的方式肯定比暴力的效率高,可以參考這篇部落格:hashmap.containskey(value)時間複雜度分析

2. 題解二,三都沒有問題。題解二hashmap中雖然覆蓋了key,但是第二次遍歷時利用陣列元素作為比較,而陣列中元素是完好的(陣列沒有改動)。舉例:[2,2,3,6,5],target=4,map中只有<2,1>(因為<2,0>被覆蓋了),但是第二次遍歷,第乙個陣列元素下標為0,值為2,此時下標0與hashmap中<2,1>的下標1不同,所以返回結果new int[0,1]。題解三中在map中進行put之前先進行判斷,判斷將要放入元素與map中元素是否滿足題解條件,如果不滿足再放入,當put操作覆蓋map中元素的情況出現時,說明被覆蓋的值和當前放入的數值相同,但是它們相加並不能滿足條件(因為先判斷再put),所有覆蓋是沒有影響的。還有因為題目說明了「假設每種輸入只會對應乙個答案「,所以不會出現<2, 2, 2, 3, 6, 5>這種情況

力扣1 兩數之和

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...

力扣 1 兩數之和

方法一 暴力遍歷 時間複雜度o n 2 執行超時 for i in range len nums for j in range i 1,len nums res nums i nums j if res target return i,j 方法二 時間複雜度o n for i in range le...

力扣 1 兩數之和

在該題中 很容易想到用暴力法來解決 直接進行n 2次尋找 此時 時間複雜度很高 而要降低時間複雜度 即減少查詢次數 可以用hashmap 儲存num i i 降低了尋找可能存在的對應數字的次數 mapmap new hashmap for int i 0 i nums.length i for in...