首页 > 其他分享 >返回三数之和为0的三元组.

返回三数之和为0的三元组.

时间:2023-02-23 09:47:49浏览次数:29  
标签:返回 right nums int 三数 三元组 指针 left

//

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

 

//class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { if (nums[i] > 0) { return result; } if (i > 0 && nums[i] == nums[i - 1]) { continue; } int left = i + 1; int right = nums.length - 1; while (right > left) { int sum = nums[i] + nums[left] + nums[right]; if (sum > 0) { right--; } else if (sum < 0) { left++; } else { result.add(Arrays.asList(nums[i], nums[left], nums[right])); while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[left] == nums[left + 1]) left++; right--; left++; } } } return result; } }

 

 

//思路:采用双指针法,首先将数组排序,最外层是一个for循环(起始为i=0),在取到nums[0]的情况下,令左指针为1,右指针为nums.length-1,判断三数相加是否为0,然后按逻辑移动左右指针,当找到满足条件的三元组后再对左右指针进行去重操作(因为不能有重复的三元组),左右指针移动完毕后,继续for循环,在对基准数去重时(左右指针之外的那个数),不能用if(nums[i]==nums[I+1])因为这样可能会使得有重复数的三元组被丢掉,应该用if(nums[i]==nums[i-1])

ps:好难的medium喔.

标签:返回,right,nums,int,三数,三元组,指针,left
From: https://www.cnblogs.com/zzzzzzx/p/17146759.html

相关文章