1. 程式人生 > >LeetCode 15 — 3Sum(三數之和)

LeetCode 15 — 3Sum(三數之和)

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.

Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

翻譯
給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]

分析
先將陣列排序,再一個數從頭遍歷,剩下的兩個數從首尾靠近,找三數之和為target的,值得注意的是去除重複。

c++實現

class Solution {
public:
    vector<vector<int>>
threeSum(vector<int>& nums) { vector<vector<int>> res; if (nums.size() < 3) return res; vector<int> tmp; sort(nums.begin(),nums.end()); for (int i = 0; i < nums.size()-2; i++) { if (i > 0 &&
nums[i] == nums[i-1]) continue; int j = i+1; int k = nums.size()-1; while (j < k) { if (nums[i]+nums[j]+nums[k] < 0) j++; else if (nums[i]+nums[j]+nums[k] > 0) k--; else { tmp.clear(); tmp.push_back(nums[i]); tmp.push_back(nums[j]); tmp.push_back(nums[k]); res.push_back(tmp); j++; k--; while (j < k && nums[j] == nums[j-1]) j++; while (j < k && nums[k] == nums[k+1]) k--; } } } return res; } };