給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。
示例:
分析:因為題目假設「每個輸入只對應一種答案,且相同的元素不能被重複利用」,這就降低了難度。
暴力法:使用兩次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修改題目的要求後,解題的大體思路是一致的,只是再返回資料的時候,處理上有些差異。因為leetcode上沒有提供這種情況下的測試用例,因此,下面給出的**只是參考(單一用例跑通)。因為 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]
另外,由於筆者對hash表的使用尚不熟練,這個給出的解法是採用暴力法。
#include #includeusing
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 ...