Leetcode 15. 三数之和
难度
题目
https://leetcode-cn.com/problems/3sum/
思路
双指针
本题最关键的是如何去除重复解。
首先,如果数组长度小于3,返回空
按从小到大顺序排序数组。
如果长度大于等于3
在遍历数组的过程中维护一个left和right
left = i + 1, right = nums.length
如果num[i] > 0,也即是后面都是大于0的,返回结果。
其次,如果nums[i]与nums[i - 1]相等,也就是nums[i]这个值之前已经判断过,continue。
如果发现了nums[i] + nums[left] + nums[right] == 0,将其加入结果中。并通过下面步骤去重。
如果nums[left] == nums[left + 1],结果重复,left += 1
right类似。
solution
class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); if (nums.length < 3) { return res; } for (int i = 0; i < nums.length; i++) { if (nums[i] > 0) return res; if (i > 0 && nums[i] == nums[i - 1]) continue; //第一个为nums[i]的值已经判断过 int left = i + 1; int right = nums.length - 1; while (left < right) { if (nums[i] + nums[left] + nums[right] == 0) { res.add(Arrays.asList(nums[i], nums[left], nums[right])); while (left < right && nums[left] == nums[left + 1]) left += 1; while (left < right && nums[right] == nums[right - 1]) right -= 1; left += 1; right -= 1; } else if (nums[i] + nums[left] + nums[right] > 0) right -= 1; else left += 1; } } return res; } }