給定包含 n 個整數的數組 nums,找出所有不重複的三元組 [a, b, c],使得 a + b + c = 0。要求三元組內非遞減排序,解集不含重複三元組。
i 從 0 到 n-3nums[i] > 0 直接結束(三正數和不可能為 0)nums[i](i > 0 && nums[i] == nums[i-1])i+1 ... n-1 區間設置 l, r
sum > 0 → r--(和太大,需減小)sum < 0 → l++(和太小,需增大)sum == 0 → 記錄答案,l++ 並跳過重複 nums[l]class Solution {
public:
vector> threeSum(vector& nums) {
vector> res;
sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i < n - 2 && nums[i] <= 0; ++i) {
if (i > 0 && nums[i] == nums[i-1]) continue; // 去重第一個數
int l = i + 1, r = n - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (sum > 0) {
--r;
} else if (sum < 0) {
++l;
} else {
res.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;
++l; --r; // 繼續尋找下一組
}
}
}
return res;
}
};
數組:[-4, -1, -1, 0, 1, 2]
i=0: -4 → l=1(-1), r=5(2) sum=-3 → l++
i=1: -1 → l=2(-1), r=5(2) sum=0 ✓ [-1,-1,2]
跳過 l=2 重複 -1
i=2: -1 (跳過,與 i=1 重複)
i=3: 0 → l=4(1), r=5(2) sum=3 → r--
O(n²) —— 排序 O(n log n) + 雙層循環 O(n²)O(1) 或 O(log n)(排序棧空間),不計輸出空間l < r 而非 l <= rnums[i] > 0 提前終止,導致 TLElong long 防溢出(本題 int 範圍內安全)O(n³)sum < target 的三元組數