题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = [] 
输出:[]
示例 3:
输入:nums = [0] 
输出:[]
提示:
- 0 <= nums.length <= 3000
 - -105 <= nums[i] <= 105
 
个人解法
JavaScript
/** @lc app=leetcode.cn id=15 lang=javascript** [15] 三数之和*/// @lc code=start/*** @param {number[]} nums* @return {number[][]}*/var threeSum = function (nums) {const result = [];const resultMap = new Map();let left = 0;let right = nums.length - 1;if (nums.length < 3) {return [];}const arr = nums.sort((a, b) => a - b);for (; arr[left] < 0; left++) {right = nums.length - 1;let mid = left + 1;while (mid < right) {const temp = arr[left] + arr[mid] + arr[right];if (temp === 0) {const str = `${arr[left]}${arr[mid]}${arr[right]}`;if (!resultMap.has(str)) {resultMap.set(str);result.push([arr[left], arr[mid], arr[right]]);}while (mid < right && nums[mid] == nums[mid + 1]) mid++; // 去重while (mid < right && nums[right] == nums[right - 1]) right--; // 去重mid++;right--;} else if (temp > 0) {right--;} else if (temp < 0) {mid++;}}}while (arr[left] < 0 && left < right) {left++;}while (arr[right] > 0 && left < right) {right--;}if (right - left >= 2) {result.push([0, 0, 0])}return result;};// @lc code=end
Java
class Solution {public static List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> listList = new ArrayList<>();int i, left, right;int l = nums.length;if(l < 3) {return listList;}Arrays.sort(nums);for (i = 0; i < l; i++) {if (nums[i] > 0) {return listList;}if (i>0&&nums[i] == nums[i - 1]) {continue;}left = i + 1;right = l - 1;while (left < right) {if (nums[i] + nums[left] + nums[right] < 0) {left=left+1;} else if (nums[i] + nums[left] + nums[right] > 0) {right=right-1;} else if (nums[i] + nums[left] + nums[right] == 0) {List<Integer> list = new ArrayList<>();list.add(nums[i]);list.add(nums[left]);list.add(nums[right]);listList.add(list);while (left<right&&nums[left] == nums[left + 1]) {left=left+1;}while (left<right && nums[right] == nums[right - 1]) {right=right-1;}left=left+1;right=right-1;}}}return listList;}}
更优解法
Java
JavaScript
/*** @param {number[]} nums* @return {number[][]}*/var threeSum = function(nums) {let ans = [];const len = nums.length;if(nums == null || len < 3) return ans;nums.sort((a, b) => a - b); // 排序for (let i = 0; i < len ; i++) {if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环if(i > 0 && nums[i] == nums[i-1]) continue; // 去重let L = i+1;let R = len-1;while(L < R){const sum = nums[i] + nums[L] + nums[R];if(sum == 0){ans.push([nums[i],nums[L],nums[R]]);while (L<R && nums[L] == nums[L+1]) L++; // 去重while (L<R && nums[R] == nums[R-1]) R--; // 去重L++;R--;}else if (sum < 0) L++;else if (sum > 0) R--;}}return ans;};
