淘宝网网站开发,台州网站制作价格,万能浏览器app,网站模板库软件给你一个整数数组 nums #xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k #xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请
你返回所有和为 0 且不重复的三元组。
注意#xff1a;答案中不可以包含重复的三元组。
示例 …给你一个整数数组 nums 判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k 同时还满足 nums[i] nums[j] nums[k] 0 。请
你返回所有和为 0 且不重复的三元组。
注意答案中不可以包含重复的三元组。
示例 1
输入nums [-1,0,1,2,-1,-4] 输出[[-1,-1,2],[-1,0,1]] 解释 nums[0] nums[1] nums[2] (-1) 0 1 0 。 nums[1] nums[2] nums[4] 0 1 (-1) 0 。 nums[0] nums[3] nums[4] (-1) 2 (-1) 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意输出的顺序和三元组的顺序并不重要。 示例 2
输入nums [0,1,1] 输出[] 解释唯一可能的三元组和不为 0 。 示例 3
输入nums [0,0,0] 输出[[0,0,0]] 解释唯一可能的三元组和为 0 。
提示
3 nums.length 3000 -105 nums[i] 105 来源力扣LeetCode 链接https://leetcode.cn/problems/3sum 题解
思路 开头容易让人想到三层循环hash去重但时间复杂度和空间消耗比较大 使用排序双指针达到去除重复值的作用 还要明确几个条件 数组为空或数组长度小于三排序后最小值为正数就不可能存在想加为0 的情况有连续重复的数字要往后移这样就能保证去重的效果若三个数组位的值想加等于0还要考虑他们之后的情况是否又有重复的值若三个数组位的值相加小于零要考虑将L向后移一位若三个数组位的值相加大于零要考虑将R向前移一位
class Solution {public static ListListInteger threeSum(int[] nums) {ListListInteger ansnew ArrayList();int lennums.length;if(numsnull||len3){return ans;//如果数组的长度小于3 或者数组为空返回值为空}//对数组排序Arrays.sort(nums);//时间复杂度为nlognfor(int i0;ilen;i){if(nums[i]0){break;}//最小的都大于0不可能存在加起来等于0的情况if(i0nums[i]nums[i-1]) continue;//相邻值相同去重int Li1;int Rlen-1;while(LR){int sum0;sumnums[i]nums[R]nums[L];if(sum0){ans.add(Arrays.asList(nums[i],nums[L],nums[R]));while(LRnums[L]nums[L1]) L;while(LRnums[R]nums[R-1]) R--;L;R--;}else if(sum0) L;else if(sum0) R--;}}return ans;}
}