'''

class Solution {

public:

vector<vector<int>> threeSum(vector<int>& nums) {

vector<vector<int>> results;

```
int n = nums.size();
// return empty if less than 3 numbers in total
if(n < 3) return results;
// sort first
sort(nums.begin(), nums.end());
// pick the 1st number
for(int i = 0; i < n -2; i++ ) {
// pick the 2nd number to be the next of 1st number then increment by 1
for(int j = i+1; j < n-1; j++) {
int sumofTwo = nums[i] + nums[j];
// pick the 3rd number to be the next of 2nd number then increment by 1
for(int k = j + 1; k < n; k++ ) {
// skip duplicate 3rd numbers
while(nums[k]== nums[k+1]) k++;
int sumofThree = (sumofTwo + nums[k]);
if( sumofThree== 0 ) {
// yes! found one, push to the results
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
results.push_back(temp);
} else if ( sumofThree > 0 ) {
// exit loop of remaining 3rd number if sum of 3 exceed 0 because the list is alr sorted
break;
}
// skip duplicate 2nd numbers
while(nums[j]== nums[j+1]) j++;
}
// skip the duplicate 1st, it is put at the back to allow the 1st and 2nd number to be the same eg. -1 -1 0
while(nums[i]== nums[i+1]) i++;
}
}
return results;
}
```

};

'''