由Two Sum問題展開

2021-10-24 02:24:36 字數 2107 閱讀 5699

two sum問題是大多數刷leetcode的小夥伴們遇到的第乙個問題。下面我將從三個方面為各位小夥伴們講述two sum問題。

1、two sum問題的描述和解法

2、雜湊表的原理及其應用

3、由two sum問題擴充套件的其他問題的解題思路

1、two sum問題的描述。

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

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

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

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

所以返回 [0, 1]

思路一:

這個問題最容易想到的思路就是,由兩個索引迴圈遍歷nums陣列,遍歷所有可能的兩個數字的組合,如(2, 7), (2, 11), ······ (11, 15)。然後,對組合裡的數字求和,判斷這個和是否等於target,如果相等,則將這兩個整數所對應的下標輸出。

這個思路的演算法複雜度是o(n^2)。

class solution {

public:

vectortwosum(vector& nums, int target) {

size_t len = nums.size();

bool is_found = false;

vectorresult;

for (int i = 0; i < len; i++) {

for (int j = i+1; j < len; j++) {

if (nums[i] + nums[j] == target)

result.push_back(i);

result.push_back(j);

is_found = true;

if (is_found)

break;

if (is_found)

break;

return result;

思路二:

另外一種方法是,借助雜湊表良好的查詢效能,可以將時間複雜度壓縮到o(n)。也就是說,遍歷一次陣列,就能找到在陣列中和為目標值的兩個數字的下標。

class solution {

public:

vectortwosum(vector& nums, int target) {

size_t len = nums.size();

vectorresult;

unordered_mapdata;

for (size_t i = 0; i < len; i++) {

if (data.find(nums[i]) == data.end()) {

data[target - nums[i]] = i;

else {

result.push_back(data[nums[i]]);

result.push_back(i);

break;

return result;

2、雜湊表的原理及其應用

在解決two sum問題的過程中,用到了雜湊表。

此處順便簡單講述一下雜湊表,方便各位小夥伴了解一些原理性的內容。

雜湊表是一種能夠快速訪問的資料結構。存的時間複雜度是o(1),取的時間複雜度也是o(1)。訪問都可以在常量時間內完成。

要構建乙個雜湊表,主要由兩個步驟(雜湊函式、碰撞衝突):

第乙個步驟:使用雜湊函式將被查詢的鍵轉化為陣列的乙個索引。

第二個步驟:當兩個或多個鍵對映到相同的陣列索引時,需要使用一些方法去解決碰撞衝突這個問題。常用的解決碰撞衝突的方法:拉鍊法和線性探測法。

有關雜湊表的詳細內容,如雜湊表的雜湊函式一般有哪些、拉鍊法和線性探測法是如何工作的等內容,請參考相關博文。

3、由two sum問題擴充套件的其他問題的解題思路

two sum問題可以進一步擴充套件成three sum問題。

稍後將附上由two sum問題擴充套件出來的問題的解法。

leetcode系列 twosum問題

題目描述 輸入 乙個陣列 nums 乙個數 target 輸出 從陣列中取兩個數使得兩數之和等於target,輸出這兩個數的下標 1,一開始的想法是,使用兩重迴圈直接一一遍歷,窮舉出這兩個數,並得到他們的下標 public static int twosum1 int nums,int target...

Two Sum 問題 雜湊演算法

這個問題的最基本形式是這樣 給你乙個陣列和乙個整數target,可以保證陣列中存在兩個數的和為target,請你返回這兩個數的索引。比如輸入nums 3,1,3,6 target 6,演算法應該返回陣列 0,2 因為 3 3 6。這個問題如何解決呢?首先最簡單粗暴的辦法當然是窮舉了,這個解法非常直接...

層次樹展開問題

在資料倉儲的層次建模時,常用遞迴的方式表示一顆層次樹,但有些bi工具的前端不支援遞迴,所以為了實現資料下鑽,可以把一棵遞迴樹進行擴充套件。建立原始樹表,並生成資料 create table tree c parent integer,c child integer insert into tree ...