# LeetCode : 0015. 3Sum (array) ###### tags:`leetcode` > C++ Vscode be run code ``` #include <bits/stdc++.h> #include <iostream> #include <vector> using namespace std; class BaseVectorPrint { public: void BasePrint00(vector<int>& num) { for (size_t i = 0; i < num.size(); ++i) { cout << num.at(i) << "; "; } cout << endl; } void BasePrint01(vector<int>& num) { for (size_t i = 0; i < num.size(); ++i) { cout << num[i] << "; "; } cout << endl; } void BasePrint02(vector<int>& num) { for (const auto &item : num) { cout << item << "; "; } cout << endl; } void TwoDimensionalPrint(vector<vector<int>> &num){ for (int i = 0; i < num.size(); i++) { for (int j = 0; j < num[i].size(); j++) { cout << "[" << num[i][j] << "]"; } cout << endl; } } }; class BaseSolution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(begin(nums), end(nums)); vector<vector<int>> res; for (int i = 0; i < nums.size() && nums[i] <= 0; ++i) if (i == 0 || nums[i - 1] != nums[i]) { twoSumII(nums, i, res); } return res; } void twoSumII(vector<int>& nums, int i, vector<vector<int>> &res) { int lo = i + 1, hi = nums.size() - 1; while (lo < hi) { int sum = nums[i] + nums[lo] + nums[hi]; if (sum < 0) { ++lo; } else if (sum > 0) { --hi; } else { res.push_back({ nums[i], nums[lo++], nums[hi--] }); while (lo < hi && nums[lo] == nums[lo - 1]) ++lo; } } } }; } class Solution01 { public: vector<vector<int>> threeSum(vector<int>& num) { sort(begin(num), end(num)); vector<vector<int>> res; for (int i = 0; i < num.size() && num[i] <= 0; ++i) if (i == 0 || num[i - 1] != num[i]) { twoSum(num, i, res); } return res; } void twoSum(vector<int>& num, int i, vector<vector<int>> &res) { // 《unordered_set it The only container for an element. 》// unordered_set<int> seen; for (int j = i + 1; j < num.size(); ++j) { int complement = -num[i] - num[j]; // 《unordered_set.count(element) it check element it in unordered_set 》// // 《ex : seen.count(999) , if seen have "999" return 1, // else have not it , return 0》; if (seen.count(complement)) { res.push_back({num[i], complement, num[j]}); //res 2d vector , so input 1d vector font {1,2,3} while (j + 1 < num.size() && num[j] == num[j + 1]) { ++j; } } seen.insert(num[j]); } } }; class Solution02 { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ans; int n = nums.size(); if(n<3) return ans; //check edge > 4 or not return null; sort(nums.begin(),nums.end()); for(int left=0; left<n-2; left++) { if(nums[left]>0) return ans; if(left>0 && nums[left]==nums[left-1]) continue; int mid = left+1; //set first mid = left + 1 int right = n-1; //set first right = array[last] = nums.size()-1 = len - 1 while(mid<right) { int sum = nums[left]+nums[mid]+nums[right]; if(sum>0) right--; else if(sum<0) mid++; else { // sum = 0 , so mid and right move edge selection. ans.push_back({nums[left],nums[mid],nums[right]}); while(mid<right && nums[mid]==nums[mid+1]) mid++; // if have same nums jump it mid++; while(mid<right && nums[right]==nums[right-1]) right--; // if have same nums jump it right--; } } } return ans; } }; int main(void) { BaseVectorPr int print_test; Solution01 ArraySoultion; vector<int> input_Nums = {1,3,5,-1,0,-2,-4,-5}; vector<vector<int>> ans ; ans = ArraySoultion.threeSum(input_Nums); print_test.BasePrint02(input_Nums); print_test.TwoDimensionalPrint(ans); //printf("%d\n",input_Nums); printf("test\n"); system("pause"); } ```