15-三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
1 2 3 4 5 6 7 8 9 10 11 | 给定数组 nums = [- 1 , 0 , 1 , 2 , - 1 , - 4 ], 满足要求的三元组集合为: [ [- 1 , 0 , 1 ], [- 1 , - 1 , 2 ] ] 来源:力扣(LeetCode) 链接:https: //leetcode-cn.com/problems/3sum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 |
思路:
首先,可以先把数组排序,使用Arrays.asList();之后,对于每一个数,都在这个数后面的“子数组”里面找“两个数”(其实有可能有很多组“两个数”),使得三个数相加为零。为了方便,可以用双指针法,一个left指向这个子数组的第一个元素,另一个right指向子数组最后一个元素。因为数组拍好了顺序,假如三个数加起来小于零,说明left太小了,应该加一。如果三数之和加起来大于零,说明right太大了。应该right减小。
其次,题目说不可重复,有两个情况可能重复,首先,是“第一个数”。其次,是用双指针表示的两个数。left<right这个循环条件不要忘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | class Solution { public List<List<Integer>> threeSum( int [] nums) { Arrays.sort(nums); //排序 List<List<Integer>> res= new ArrayList<>(); if (nums.length< 3 ||nums== null ) //如果长度小于三,不存在解 { return res; } if (nums[ 0 ]> 0 ) return res; int right=nums.length; int left= 0 ; for ( int i= 0 ;i<nums.length- 2 ;i++) { if (nums[i]> 0 ) return res; //因为已经排序了。如果当前元素大于零,右边所有元素都大于零,没解了 if (i> 0 &&nums[i]==nums[i- 1 ]) //防止作为第一个数的nums[i]重复 { continue ; } left=i+ 1 ; right=nums.length- 1 ; while (left<right) //对于每个i,找到与之对应的俩数,使得和为零 { if (nums[i]+nums[left]+nums[right]== 0 ) { res.add(Arrays.asList(nums[i],nums[left],nums[right])); //把三个数包装成一个List,当然这个list大小不可变,要想可变,外层加一个new ArrayList<Integer>() while (left<right&&nums[left]==nums[left+ 1 ]) left++; //防止left,right两个数重复//left<right容易忘掉!!! while (left<right&&nums[right]==nums[right- 1 ]) right--; left++; right--; } else if (nums[i]+nums[left]+nums[right]< 0 ) //left太小 { left++; } else { right--; } } } return res; } } |
1 | Arrays.asList()在我的博客里转载了介绍,是把数组转换成List。 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步