LeetCode--15.三数之和(双指针法)
2026/4/6 13:22:09 网站建设 项目流程
15.三数之和题目描述给你一个整数数组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题解双指针法是不会漏解具有高效剪枝效率的查找方法。在使用前需要将给定数组进行从小到大排序。代码classSolution{publicListListIntegerthreeSum(int[]nums){// 将数组有序排列Arrays.sort(nums);// 最终要返回的结果组ListListIntegerresultnewArrayList();// 固定一端i左右指针遍历三元组for(inti0;inums.length-2;i){// 边界条件判断if(nums[i]0)break;// 对下标i对应元素进行去重if(i0nums[i]nums[i-1])continue;// 左指针intlefti1;// 右指针intrightnums.length-1;// 双指针相向运动while(leftright){intsumnums[i]nums[left]nums[right];// 当和大于0right左移if(sum0){right--;}elseif(sum0){// 当和小于0left右移left;}else{result.add(Arrays.asList(nums[i],nums[left],nums[right]));// 对left和right进行去重while(leftrightnums[left]nums[left1])left;while(leftrightnums[right]nums[right-1])right--;// 将一组正确的解过滤left;right--;}}}returnresult;}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询