四數之和的兩種解題思路,C

2021-10-04 13:58:54 字數 2101 閱讀 1190

leetcode18題,經典題目。

題意:給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重複的四元組。

這一類題目包括兩數之和、三數之和、四數之和、還可以拓展到k數之和。解題時可以從兩數之和以及三數之和的求解中拓展開。

解體思路:

排序+雙指標(適當剪枝可提高執行速度)

兩數之和:

對陣列nums進行公升序排序,然後用兩個指標i和j分別指向陣列的頭和尾,指標i和j向彼此靠攏,並判斷nums[i]+nums[j]是否等於target。

三數之和:

在兩數的基礎上多了乙個外層迴圈,在最外層迴圈中固定乙個數(座標為m),在內層迴圈中採用雙指標指向另外兩個數,判斷nums[m]+nums[i]+nums[j]是否等於target。

四數之和:

在三數的基礎上又多加乙個外層迴圈,兩個外層迴圈可固定兩個數,內層雙指標指向剩下的兩個數。

//兩數之和

vector> twosum(vector& nums, int target) );

while(i> threesum(vector& nums) );

while(a> foursum(vector& nums, int target)

*/int a=j+1,b=nums.size()-1;

//剪枝法2:在每一輪通過四個數和的最大值和最小值加以限制

if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)

if(nums[i]+nums[j]+nums[b]+nums[b-1]i+1&&nums[j]==nums[j-1]) continue;

while(a);

while(a借助雜湊表(字典)

兩數之和:

遍歷陣列內的每乙個元素nums[i],由元素為鍵,元素的座標為值,將他們存入字典中(dict[nums[i]]=i),再次遍歷陣列nums,對於每個元素nums[j],只需要判斷 target-nums[j] 是否在字典中,如果在且結果列表中還沒有[nums[i],nums[j]],則將[nums[i],nums[j]]加入結果列表中。

三數之和:

類似於兩數之和的思想,不過字典中的鍵是target-nums[i]-nums[j],對應的值是這兩個數構成的組合,即pair(nums[i],nums[j])。

四數之和:

將四個數加法拆解成2個2個數的加法,那麼它可以用類似兩數相加的方法完成。在字典中,陣列中的任意兩數之和作為鍵,對應的值是乙個集合,裡面包含所有和等於鍵的兩個數的座標構成的組合。

**比較好理解:

//兩數之和

vector> twosum(vector& nums, int target) );

map1.erase(nums[j]); //將已經找到的元素對排除

map1.erase(key);}}

}return res;

}//三數之和

vector> threesum(vector& nums) );

res.erase(nums[j]);

}else}}

return result;

}//四數之和,這部分寫得不好,還請路過的大佬指點

vector> foursum(vector& nums, int target)

}

for(int i=0;i0&&nums[i]==nums[i-1]) continue;

for(int j=i+1;ji+1&&nums[j]==nums[j-1]) continue;

int key=target-nums[i]-nums[j];

if(dict.find(key)!=dict.end());

sort(temp.begin(),temp.end());

bool rep=false;

if(!res.empty())}}

if(!rep) res.emplace_back(temp);}}

}}

}return res;

}

快速排序的兩種思路(C 實現)

includeusing namespace std int partition int array,int startindex,int endindex void quicksort int array,int startindex,int endindex 分治 雙邊迴圈法 int parti...

兩數之和,三數之和,最接近的三數之和,四數之和

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

有效括號的兩種思路

有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。一 陣列 1 空字串可被認為是有效字串,單獨判斷 3 字串的長度必須為偶數,否則不是有效括號 2 利用替換的思想 1 如果 成對出現,用 替換,相當於刪除 2 剩下的,如果有成對的,繼續替換 ...