- 題目描述:三數之和
給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合爲:
[
[-1, 0, 1],
[-1, -1, 2]
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/3sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
- C++編程實現
排序 + 雙指針
本題的難點在於如何去除重複解。
算法流程:
特判,對於數組長度n,如果數組爲null或者數組長度小於3,返回[]。
對數組進行排序。
遍歷排序後數組:
若nums[i]>0:因爲已經排序好,所以後面不可能有三個數加和等於0,直接返回結果。
對於重複元素:跳過,避免出現重複解
令左指針L=i+1,右指針R=n−1,當L<R時,執行循環:
當nums[i]+nums[L]+nums[R]==0,執行循環,判斷左界和右界是否和下一位置重複,去除重複解。並同時將L,R移到下一位置,尋找新的解
若和大於0,說明nums[R]太大,R左移
若和小於0,說明nums[L]太小,L右移
複雜度分析
時間複雜度O(n2),數組排序O(NlogN),遍歷數組O(n),雙指針遍歷O(n),總體O(NlogN)+O(n)∗O(n),O(n2)
空間複雜度:O(1)
作者:zhu_shi_fu
鏈接:https://leetcode-cn.com/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int nsize = nums.size();
if (nsize < 3)
return {};
sort(nums.begin(), nums.end());
vector<vector<int>> res;
int l, r;
for (int i=0; i<nsize-2; i++)
{
if(nums[i]>0) break;
if(i > 0 && nums[i] == nums[i-1]) continue;
l = i+1;
r = nsize-1;
while(l<r)
{
int sumnum = nums[i] + nums[l] + nums[r];
if (sumnum > 0)
r--;
else if(sumnum < 0)
l++;
else
{
res.push_back({nums[i], nums[l], nums[r]});
while(l<r && nums[l] == nums[++l]);
while(l<r && nums[r] == nums[--r]);
}
}
}
return res;
}
};
- LeetCode16:最接近的三數之和
解題思路如上類似,但是沒有固定的target值,不需要比較最左端值/最右端值與target的大小,因爲是三個數之和與target纔有可比性。