/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var result = [];
nums = nums.sort(function(a, b) { return a-b; });
for (var i = 0; i < nums.length; i++) {
var p = i + 1;
var q = nums.length - 1;
if (i > 0 && nums[i] === nums[i - 1]) continue;
while(p < q) {
var sum = nums[i] + nums[p] + nums[q];
if (sum === 0) {
result.push([nums[i], nums[p], nums[q]].sort(function(a, b) { return a-b; }));
while(++p < q && nums[p] === nums[p - 1]) {}
while(--q > p && nums[q] === nums[q + 1]) {}
}
if (sum < 0) {
++p;
}
if (sum > 0) {
--q;
}
}
}
return result;
};