Дан целочисленный массив nums
Нужно вернуть все триплеты [nums[i], nums[j], nums[k]] такие, что i != j, i != k и j != k, и nums[i] + nums[j] + nums[k] == 0.
Обратите внимание, что набор решений не должен содержать повторяющихся триплетов.
Входные данные: nums = [-1,0,1,2,-1,-4]
Результат: [[-1,-1,2],[-1,0,1]]
Пояснение:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0. nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0. nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
Различными триплетами являются [-1,0,1] и [-1,-1,2]. Обратите внимание, что порядок вывода и порядок триплетов не имеет значения.
Входные данные: nums = [0,1,1]
Результат: []
Пояснение: Единственный возможный триплет не суммируется до 0.
Входные данные: nums = [0,0,0]
Результат: [0,0,0]
Пояснение: Единственный возможный триплет суммируется до 0.
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int target = 0, i, j, k, sum;
set<vector<int>> s;
std::sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++){
j = i + 1;
k = nums.size() - 1;
while (j < k) {
if ((sum = nums[i] + nums[j] + nums[k]) == target) {
s.insert({nums[i], nums[j], nums[k]});
j++;
k--;
} else if (sum < target) {
j++;
} else {
k--;
}
}
}
vector<vector<int>> output;
for(auto triplets : s)
output.push_back(triplets);
return output;
}
};