[LeetCode] 3Sum

来源:互联网 发布:移动宽带提速软件 编辑:程序博客网 时间:2024/06/17 19:08

问题:

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:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • 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)

这道题的思路很简单:先将input排序,然后设置三个pointers:i, j, k,其中i从0到n-3;j从i+1开始递增;k从n-1开始递减(保持j恒大于k),然后算对应的三个数的sum。如果这个sum等于0,则就是我们要的答案;如果小于零,则j向后推一个;若大于零,则k向前推一个。

我第一次做犯的错误:

class Solution {public:vector<vector<int> > threeSum(vector<int> &num) {vector<vector<int> > result;if (num.size() < 3) return result;std::sort(num.begin(), num.end());for (int i = 0; i < num.size() - 2; i ++) {int j = i + 1;int k = num.size() - 1;while (j < k) {if (sum == 0) {vector<int> temp;temp.push_back(num[i]);temp.push_back(num[j]);temp.push_back(num[k]);result.push_back(temp);j ++;k --;}else if (sum > 0) k --;else j ++;}}return result;}};

这段代码的问题是:没有考虑到input中有可能有重复的数字出现。如果有重复的数字出现的话,那么上面这段代码返回的result里面就也有重复的triple。

改正(O(n^2)):

class Solution {public:vector<vector<int> > threeSum(vector<int> &num) {vector<vector<int> > result;if (num.size() < 3) return result;std::sort(num.begin(), num.end());for (int i = 0; i < num.size() - 2; i ++) {if (i != 0 && num[i] == num[i - 1]) continue;int j = i + 1;int k = num.size() - 1;while (j < k) {if (j > i+1 && num[j] == num[j - 1]) {j ++;continue;}if (k < num.size() - 1 && num[k] == num[k + 1]) {k --;continue;}int sum = num[i] + num[j] + num[k];if (sum == 0) {vector<int> temp;temp.push_back(num[i]);temp.push_back(num[j]);temp.push_back(num[k]);result.push_back(temp);j ++;k --;}else if (sum > 0) k --;else j ++;}}return result;}};

这样的话,只要发现是重复的,我们就continue,避免了上面说的问题。



0 0
原创粉丝点击