本文首發於公衆號「五分鐘學算法」,是圖解 LeetCode 系列文章之一。c++
我的網站:www.cxyxiaowu.comgit
題目來源於 LeetCode 上第 15 號問題:三數之和。github
給定一個包含 n 個整數的數組 nums
,判斷 nums
中是否存在三個元素 *a,b,c ,*使得 a + b + c = 0 ?找出全部知足條件且不重複的三元組。算法
題目須要咱們找出三個數且和爲 0 ,那麼除了三個數全是 0 的狀況以外,確定會有負數和正數,因此一開始能夠先選擇一個數,而後再去找另外兩個數,這樣只要找到兩個數且和爲第一個選擇的數的相反數就好了。也就是說須要枚舉 a 和 b ,將 c 的存入 map 便可。數組
須要注意的是返回的結果中,不能有有重複的結果。這樣的代碼時間複雜度是 O(n^2)。在這裏能夠先將原數組進行排序,而後再遍歷排序後的數組,這樣就能夠使用雙指針以線性時間複雜度來遍歷全部知足題意的兩個數組合。動畫
待補充網站
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
if (nums.empty() || nums.back() < 0 || nums.front() > 0) return {};
for (int k = 0; k < nums.size(); ++k) {
if (nums[k] > 0) break;
if (k > 0 && nums[k] == nums[k - 1]) continue;
int target = 0 - nums[k];
int i = k + 1, j = nums.size() - 1;
while (i < j) {
if (nums[i] + nums[j] == target) {
res.push_back({nums[k], nums[i], nums[j]});
while (i < j && nums[i] == nums[i + 1]) ++i;
while (i < j && nums[j] == nums[j - 1]) --j;
++i; --j;
} else if (nums[i] + nums[j] < target) ++i;
else --j;
}
}
return res;
}
};
複製代碼