15. 3Sum LeetCode题解

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

Subscribe to see which companies asked this question.


题意:

给定一个整数数组S,是否存在三个元素使得a+b+c=0成立,找到数组中所有成立的组合(不含重复的组合)


题解:

如果能够事先确定一个元素,那么问题变成了2sum问题。

事先确定的元素可以是数组中任意一个,故遍历数组并试图将每个元素作为事先确定的元素,然后执行2sum过程。


Code【Java】

public class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        // 处理特殊情况
        if (nums.length < 3) {
            return new ArrayList<List<Integer>>();
        }
        // 数组排序
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        // 从第一个开始查找
        for (int i = 0; i < nums.length - 2; ++i) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            // 对于每个元素寻找其0 - val的2sum解
            for (int lo = i + 1, hi = nums.length - 1; lo < hi;) {
                int result = nums[i] + nums[lo] + nums[hi];
                if (result == 0) {
                    // 防止重复
                    ans.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[lo], nums[hi])));
                    while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
                    while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
                    lo++;
                    hi--;
                }
                else if (result > 0) {
                    --hi;
                } else {
                    ++lo;
                }
            }
        }
        return ans;
    }
}

Code【C++】

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        // 处理特殊情况
        if (nums.size() < 3) {
            return vector<vector<int>>();
        }
        // 数组排序
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        // 从第一个开始查找
        for (int i = 0; i < nums.size() - 2; ++i) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            // 对于每个元素寻找其0 - val的2sum解
            for (int lo = i + 1, hi = nums.size() - 1; lo < hi;) {
                int result = nums[i] + nums[lo] + nums[hi];
                if (result == 0) {
                    // 防止重复
                    int v[] = {nums[i], nums[lo], nums[hi]};
                    ans.push_back(vector<int>(v, v + 3));
                    while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
                    while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
                    lo++;
                    hi--;
                }
                else if (result > 0) {
                    --hi;
                } else {
                    ++lo;
                }
            }
        }
        return ans;
    }
};


猜你喜欢

转载自blog.csdn.net/baidu_23318869/article/details/72571842