目錄
1. 題目解析
2. 算法原理
3. 代碼編寫(xiě)
寫(xiě)在最后:
1. 題目解析
題目鏈接:15. 三數(shù)之和 - 力扣(Leetcode)
?題目就是要找出和為0的不重復(fù)的三元組,
注意三元組的每個(gè)元素是得不同的位置,那不重復(fù)又是什么意思呢?
我們可以看第一個(gè)示例,
他找出了三個(gè)三元組,但是他最后只返回了兩個(gè),
也就是,三元組的元素相同算同一個(gè)三元組。(如果沒(méi)有就返回空集。)
2. 算法原理
第一個(gè)想法當(dāng)然是暴力枚舉,具體來(lái)說(shuō)就是,
先排序,然后暴力枚舉,最后用set去重就行,
那我們就得想一想怎么把N3的暴力枚舉優(yōu)化一下,
排序之后是有序數(shù)組,那我們就得想到改用二分還是雙指針來(lái)優(yōu)化:當(dāng)然是優(yōu)先雙指針啦
來(lái)看具體解法:
固定一個(gè) i 位置:
我們只需要通過(guò)雙指針快速找到 left 位置 + right 位置的和是 4 的位置即可。
3. 代碼編寫(xiě)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size() - 2; i++) {
int left = i + 1, right = nums.size() - 1;
while(left < right) {
int sum = nums[i] + nums[left] + nums[right];
if(sum < 0) left++;
else if(sum > 0) right--;
else { // sum == 0
ans.push_back({nums[i], nums[left], nums[right]});
while(left < right && nums[left] == nums[left + 1]) left++;
while(left < right && nums[right] == nums[right - 1]) right--;
left++, right--;
}
}
while(i < nums.size() - 2 && nums[i] == nums[i + 1]) i++;
}
return ans;
}
};
寫(xiě)在最后:
以上就是本篇文章的內(nèi)容了,感謝你的閱讀。
如果感到有所收獲的話可以給博主點(diǎn)一個(gè)贊哦。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-702792.html
如果文章內(nèi)容有遺漏或者錯(cuò)誤的地方歡迎私信博主或者在評(píng)論區(qū)指出~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-702792.html
到了這里,關(guān)于【算法專(zhuān)題突破】雙指針 - 三數(shù)之和(7)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!