/** * @param{number[]} nums * @return{number[][]} */varthreeSum=function (nums) {if (nums.length<3) return [];constlist= [];nums.sort((a, b) => a - b);for (let i =0; i <nums.length; i++) {//nums is sorted,so it's impossible to have a sum = 0if (nums[i] >0) break;// skip duplicated result without setif (i >0&& nums[i] === nums[i -1]) continue;let left = i +1;let right =nums.length-1;// for each index i// we want to find the triplet [i, left, right] which sum to 0while (left < right) {// since left < right, and left > i, no need to compare i === left and i === right.if (nums[left] + nums[right] + nums[i] ===0) {list.push([nums[left], nums[right], nums[i]]);// skip duplicated result without setwhile (nums[left] === nums[left +1]) { left++; } left++;// skip duplicated result without setwhile (nums[right] === nums[right -1]) { right--; } right--;continue; } elseif (nums[left] + nums[right] + nums[i] >0) { right--; } else { left++; } } }return list;};
CPP Code:
classSolution {public:vector<vector<int>> threeSum(vector<int>& A) {sort(begin(A),end(A)); vector<vector<int>> ans;int N =A.size();for (int i =0; i < N -2; ++i) {if (i &&A[i] ==A[i -1]) continue;int L = i +1, R = N -1;while (L < R) {int sum =A[i] +A[L] +A[R];if (sum ==0) ans.push_back({ A[i],A[L],A[R] });if (sum >=0) {--R;while (L < R &&A[R] ==A[R +1]) --R; }if (sum <=0) {++L;while (L < R &&A[L] ==A[L -1]) ++L; } } }return ans; }}