电商平台网站建设,WordPress点击头像,深圳做网站的公司哪家好,视觉设计主要学什么一、题目描述给你一个整数数组 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 。来源力扣LeetCode链接https://leetcode.cn/problems/3sum著作权归领扣网络所有。商业转载请联系官方授权非商业转载请注明出处。二、运行结果三、解题思路首先对原数组按非降序的方式进行排序。逐个将从第1个至第n-2个元素作为三个元素中的第一个i另外两个元素只考虑i后面的元素采用双指针的方式两个指针分别从两端向中间靠拢如果出现重复的值就跳过只考虑第一次出现的时候避免出现重复的组合。这里效率比较低的原因可能是在循环里的判断太多可以尝试一下改进循环内结构减少判断如将while循环也改为for循环即以第二个元素的下标作为内存循环。四、AC代码class Solution {public ListListInteger threeSum(int[] nums) {int len nums.length;ListListInteger ans new ArrayList();Arrays.sort(nums); //对原数组排序for(int i0; ilen-2; i){ //第一个元素下标if(i0 nums[i]nums[i-1]) continue;int j i1, k len -1; //j是第二个元素的下标k是第三个元素的下标while(j k){ListInteger tmplist new ArrayList();if(j i1){ //去除重复的组合while(nums[j] nums[j-1] jk) j;}if(k len-1){while(nums[k] nums[k1] kj) k--;}if(j k) break;if(nums[i] nums[j] nums[k] 0){tmplist.add(nums[i]);tmplist.add(nums[j]);tmplist.add(nums[k]);ans.add(tmplist);j; k--;}else if(nums[i] nums[j] nums[k] 0) k--;else j;}}return ans;}
}