LeetCode 15 — 3Sum(C++ Java Python)

来源:互联网 发布:野兽骑行 知乎 编辑:程序博客网 时间:2024/05/17 07:55

题目:http://oj.leetcode.com/problems/3sum/

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)

题目翻译:

给定具有n个整数的数组S,其中是否存在元素a,b,c,使得a + b + c = 0?找出总和为0的所有不同三元组。
注意:
三元组( A,B, C)的元素必须非递减排序。(即a ≤ b ≤ c)
解集不能包含重复的三元组。
例如给定数组S = {-1 0 1 2 -1 -4},
解集为
(-1, 0, 1)
(-1, -1, 2)

分析:
        类似于Two Sum,但要用外循环遍历S作为a,对于b、c的求解类似Two Sum。
C++实现:
class Solution {public:    vector<vector<int> > threeSum(vector<int> &num) {vector<vector<int> > result;if(num.size() < 3){return result;}vector<int> tmp;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(num[i] + num[j] + num[k] > 0){--k;}else if(num[i] + num[j] + num[k] < 0){++j;}else{tmp.clear();tmp.push_back(num[i]);tmp.push_back(num[j]);tmp.push_back(num[k]);result.push_back(tmp);++j;--k;while(j < k && num[j] == num[j - 1]){++j;}while(j < k && num[k] == num[k + 1]){--k;}}}}return result;    }};
Java实现:(注意tmp不能在for循环外创建,否则是同一个对象,之后的赋值会改变原先的值)
public class Solution {    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();Arrays.sort(num);for (int i = 0; i < num.length - 2; ++i) {if (i > 0 && num[i] == num[i - 1]) {continue;}int j = i + 1;int k = num.length - 1;while (j < k) {if (num[i] + num[j] + num[k] > 0) {--k;} else if (num[i] + num[j] + num[k] < 0) {++j;} else {ArrayList<Integer> tmp = new ArrayList<Integer>();tmp.add(num[i]);tmp.add(num[j]);tmp.add(num[k]);result.add(tmp);--k;++j;while (j < k && num[j] == num[j - 1]) {++j;}while (j < k && num[k] == num[k + 1]) {--k;}}}}return result;    }}
Python实现:
class Solution:    # @return a list of lists of length 3, [[val1,val2,val3]]    def threeSum(self, num):        num.sort()        result = []                i = 0        while i < len(num) - 2:            if i > 0 and num[i] == num[i - 1]:                i += 1                continue                        j = i + 1            k = len(num) - 1                        while j < k:                if num[i] + num[j] + num[k] > 0:                    k -= 1                elif num[i] + num[j] + num[k] < 0:                    j += 1                else:                    tmp = [num[i], num[j], num[k]]                    result.append(tmp)                                        j += 1                    k -= 1                                        while j < k and num[j] == num[j - 1]:                        j += 1                    while j < k and num[k] == num[k + 1]:                        k -= 1            i += 1                                return result 
        感谢阅读,欢迎评论!
0 0
原创粉丝点击