算法:3个数之和15. 3Sum

Posted 架构师易筋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:3个数之和15. 3Sum相关的知识,希望对你有一定的参考价值。

15. 3Sum

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

Example 1:

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]

Example 2:

Input: nums = []
Output: []

Example 3:

Input: nums = [0]
Output: []

Constraints:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

两头逼近解法

分析:结果集不能重复,所要要排序,如果现在的数字跟以前相同,则跳过。
这里有三次跳过,可以看下面的 skip the same: 第一个数相同,第二个数相同,第三个数相同;

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        int len = nums.length;
        if (len < 3) return list;
        
        Arrays.sort(nums);
        for (int f = 0; f < len - 2; f++) {
            if (f > 0 && nums[f] == nums[f - 1]) continue; // skip the same
            int lo = f + 1, hi = len - 1;
            int target = 0 - nums[f];
            while (lo < hi) {
                if (nums[lo] + nums[hi] == target) {
                    list.add(Arrays.asList(nums[f], nums[lo], nums[hi]));
                    while (lo < hi && nums[lo] == nums[lo + 1]) lo++; // skip the same
                    while (lo < hi && nums[hi] == nums[hi - 1]) hi--; // skip the same
                    lo++;
                    hi--;
                } else if (nums[lo] + nums[hi] < target) {
                    lo++;
                } else {
                    hi--;
                }
            }
        }
        
        return list;
    }
}

以上是关于算法:3个数之和15. 3Sum的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 15. 3Sum 三数之和

LeetCode 15. 三数之和 3Sum

LeetCode 15. 三数之和 3Sum

LeetCode15题: 寻找三数和,附完整代码

LeetCode 15. 三数之和(3Sum)

Leetcode15. 三数之和(双指针)