3Sum : 給一個數組nums,判斷nums中是否存在3個元素a,b,c,使得a+b+c=0,找出所有滿足條件且不重覆得所有組合。
首先sort nums,如果第一個數大於0不會有解,如果連續兩個一樣的數,則countinue不用找,之後j<k來找到所有的值,如果合小於0,希望他大一點j+1,如果合大於0,希望他小一點k-1,找到答案後,去除重複值,最後返回結果。
時間複雜度: O(N^2)
空間複雜度: O(1)
Python
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n=len(nums)
nums.sort()
l=[]
for i in range(n-1):
if nums[i]>0: #如果第一個數大於0不會有解
break
if i>0 and nums[i]==nums[i-1]: #連續兩個一樣的數,不用找
continue
j=i+1 #最小的數
k=n-1 #最大的數
while j<k:
cur=nums[i]+nums[j]+nums[k] #三數之和
if cur<0: #合小於0,希望他大一點
j+=1
elif cur>0: #合大於0,希望他小一點
k-=1
else:
l.append([nums[i],nums[j],nums[k]]) #答案
while j+1<k and nums[j]==nums[j+1]: #去除重複值
j+=1
while k-1>j and nums[k]==nums[k-1]: #去除重複值
k-=1
j+=1
k-=1
return l
C++
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
std::sort(nums.begin(), nums.end());
const int n = nums.size();
for (int i = 0; i < n - 2; ++i) {
if (nums[i] > 0) break;
if (i > 0 && nums[i] == nums[i - 1]) continue; #連續兩個一樣的數
int l = i + 1;
int r = n - 1;
while (l < r) {
if (nums[i] + nums[l] + nums[r] == 0) { #三數之和
ans.push_back({nums[i], nums[l++], nums[r--]});
while (l < r && nums[l] == nums[l - 1]) ++l;
while (l < r && nums[r] == nums[r + 1]) --r;
} else if (nums[i] + nums[l] + nums[r] < 0) {
++l; #合小於0,左端右移
} else {
--r; #合大於0,右端左移
}
}
}
return ans;
}
};