LeetCode.15. 三数之和
难度:medium

与两数之和相比,采用哈希法太麻烦了,这道题采用双指针法。关键在于去重的操作。
Java:
- class Solution {
- public List
> threeSum(int[] nums) {
- List
> ans = new ArrayList>();
- Arrays.sort(nums);
- for (int i = 0; i < nums.length; i++) {
- // 如果nums[i] > 0 则没有符合要求的三元组
- if (nums[i] > 0) {
- return ans;
- }
- // 对i去重,当前i与前一位对比
- if (i > 0 && nums[i] == nums[i - 1]) {
- continue;
- }
- int left = i + 1;
- int right = nums.length - 1;
-
- while (right > left) {
- if (nums[i] + nums[left] + nums[right] > 0) {
- right--;
- } else if (nums[i] + nums[left] + nums[right] < 0) {
- left++;
- } else if (nums[i] + nums[left] + nums[right] == 0) {
- ArrayList
list = new ArrayList<>(); - list.add(nums[i]);
- list.add(nums[left]);
- list.add(nums[right]);
- ans.add(new ArrayList<>(list));
- while (right > left && nums[right] == nums[right - 1]) {
- right--;
- }
- while (right > left && nums[left] == nums[left + 1]) {
- left++;
- }
- // 当前结果存储并去重后到下一个判定位置
- right--;
- left++;
- }
- }
- }
-
- return ans;
- }
- }