Leetcode 001 兩數之和 擴充套件

2022-08-02 18:27:10 字數 3299 閱讀 2629

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。

你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。

示例:

分析:因為題目假設「每個輸入只對應一種答案,且相同的元素不能被重複利用」,這就降低了難度。

暴力法:使用兩次for迴圈。第乙個for迴圈依次遍歷一次陣列,每次執行過程中選取了乙個陣列元素nums[i], 再for迴圈遍歷nums[i]後面的所有元素,假設取到的元素為nums[j](其中,i+1=< j <=size-1,size為所傳入陣列的元素個數 )同時比較過程中取到的兩個元素的和演算法等於target,因為每種輸入只對應一種答案,且相同元素不同被重複利用,因此找到了就可以直接返回[i,j];沒有找到符合題意的解,就返回[-1,-1]。

//完整**#include #include 

using

namespace

std;

class

solution ;

}; vector

twosum(vector& nums, int

target)}}

//找不到則返回[-1,-1]

result.push_back(-1

); result.push_back(-1

);

return

result;

}int

main()

;

int val = 30

; cout

<< "["

<< twosum(arr,val)[0]<< ","

<< twosum(arr,val)[1] << "]"

<

return0;

}

[學而不思則惘,思而不學則殆]——

1.為什麼採用hash表的map對映可以減少一次for迴圈?

答: 採用map.count和find函式,雜湊查詢的時間複雜的為o(1).

2.map.count函式和map.find函式的比較

(1)數值的唯一性

map和set兩種容器的底層結構都是紅黑樹,所以容器中不會出現相同的元素,

因此count()的結果只能為0和1,可以以此來判斷鍵值元素是否存在(當然也可以使用find()方法判斷鍵值是否存在)。

(2)返回值的比較

拿map舉例

count( )  方法的返回值是布林值, 返回1,鍵值元素存在;返回0,鍵值元素不存在

find( )  方法返回值是乙個迭代器,成功,返回迭代器指向要查詢的元素;失敗,返回的迭代器指向end。

//

雜湊函式使用示例

#include#include

#include

using

namespace

std;

intmain()

if(maps.count(1)==0

)

//新增元素1

maps[1]="

one"

;

if(maps.find(1)!=maps.end())

if(maps.count(1

))

return0;

}

//

兩數之和-雜湊查詢

#include #include

#include

using

namespace

std;

class

solution

}result.push_back(-1

); result.push_back(-1

);

return

result;

}};int

main()

;

int val = 30

; solution test;

cout

<< "["

<< test.twosum(arr, val)[0] << ","

<< test.twosum(arr, val)[1] << "]"

<

return0;

}

擴充套件思考:給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。

注意:這裡不加上題中的限制條件。返回所有符合題意的兩數的下標,相同的元素可以重複利用。但是不能是同乙個元素與自身組合,這樣就不符合兩數的概念了。

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

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

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

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

所以返回 [0, 1],[1,2],[1,3]

修改題目的要求後,解題的大體思路是一致的,只是再返回資料的時候,處理上有些差異。因為leetcode上沒有提供這種情況下的測試用例,因此,下面給出的**只是參考(單一用例跑通)。

另外,由於筆者對hash表的使用尚不熟練,這個給出的解法是採用暴力法。

#include #include 

using

namespace

std;

class

solution }}

////修改返回值的次序

//找不到則返回[-1,-1]

if (result.size() == 0

)

return

result;

}};intmain()

;

int val = 9

; solution test;

////修改了輸出條件

LeetCode 001 兩數之和

給定乙個整數陣列nums和乙個整數目標值target,請你在該陣列中找出和為目標值的那兩個 整數,並返回它們的陣列下標。輸入 nums 2,7,11,15 target 9 輸出 0,1 解釋 因為 nums 0 nums 1 9 返回 0,1 定義乙個map,key為陣列的值,value為值對應的...

LeetCode001 兩數之和 Two Sum

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

LeetCode001 兩數之和 easy

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