这篇文章上次修改于 1197 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 > 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 [leetcode链接](https://leetcode-cn.com/problems/3sum) #### 示例 输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] #### 分析 这个题很容易想到得是暴力解法和Hash解法,但是很容易得到重复的,去重的算法甚至比原算法还费力。 所以这个题用双指针左右夹逼。得到不重复的结果 1. 先对数组排序 2. 用i从头遍历数组到倒数第二位。 3. 用俩指针,j和k,j=i+1,k=len-1; 4. 如果ijk三个位置的和大于0,那么根据已经排序的特性,k--,缩小和的大小,否则j++,提高和。 5. 遇到和为0,可以退出当前i的寻找,i++继续 #### 代码 ``` java class Solution { public List> threeSum(int[] nums) { List> list = new ArrayList<>(); Arrays.sort(nums); for(int i = 0;i < nums.length-2;i++){ if (nums[i] > 0) { return list; } if(i > 0 && nums[i] ==nums[i-1]){ continue; } int j = i + 1; int k = nums.length-1; while (j 0){ k --; }else if( nums[i] + nums[j] + nums[k] < 0){ j++; }else{ List a = new ArrayList<>(); a.add(nums[i]); a.add((nums[j])); a.add(nums[k]); list.add(a); while (k > j && nums[k] == nums[k - 1]) k--; while (k > j && nums[j] == nums[j + 1]) j++; k--; j++; } } } return list; } } ```
没有评论