leetcode第15题--3Sum

Problem:

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)

先说说我的思路吧。先排序。我也不知道为什么莫名其妙的想到固定中间一个数的方法。i从第二个开始一直到倒数第二个数,然后left从i的左边一个开始,right从i的右边一个开始,如果三个数相加大于零,那么肯定就要left往左,如果相加小于零那就right往右,如果等于零,再判断是否与已经存入sum中的最后一个判断比较不相等就写入。现在就碰到了以前没有碰到过的问题,不是Time Limit Exceeded,而是Output Limit Exceeded。查了下说,这个问题应该是while循环没有出来。但是我看了以下代码,没有理由没跳出来啊。
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num)
{
    bool flag = false;
    vector<vector<int> > sum;
    vector<int> temp = num;
    sort(temp.begin(), temp.end());
    if (num.size() < 3 || temp[0] > 0)
    return sum;

    for (int i = 1; i != num.size() - 1; i++)
    {
        int left = i - 1, right = i + 1;
        while(left>=0 && right < num.size())
        {
            if (temp[left] + temp[i] + temp[right] == 0)
            {
                vector<int> sub;
                sub.push_back(temp[left]);
                sub.push_back(temp[i]);
                sub.push_back(temp[right]);
                if (!flag)
                {
                    flag = true;
                    sum.push_back(sub);
                }
                else if(sub != sum[sum.size()-1])
                {
                    sum.push_back(sub);
                }
                left--;
                right++;
            }
            else if(temp[left] + temp[i] + temp[right] < 0)
            {
                right++;
            }
            else
                left--;
        }
    }
    sum.erase(unique(sum.begin(), sum.end()), sum.end());
    return sum;
}
};

后来请实验室的大牛(可能要去Google工作了)看了下。说应该是内存不够了。就是还是存了相同的例子。单单用判断是不是等于sum的最后一个是否相等是不行的。应该是这样,OJ里测试的时候估计给了sum的大小有限。如果重复了那就Output Limit了。其实我差成功只是一小步了。

以下代码是固定三个数的第一个,然后i从第一个到倒数第三个就行了。如果i往前移动的时候和前一个数相等那就不用再判断了,直接i++,因为以该数开头的三元组都已经计算过并存起来了。其中还有一个很好的地方就是在判断三元组是不是第一个的时候,用的是sum.size()==0 || sum.size() > 0 ...这个很好,因为第一次的时候是==0的,那||之后的就不作判断了。下一次的时候size不==0.再做后面的判断,后面的判断是因为三个数只要有两个数相等那第三个肯定也相等。代码如下。

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

            if(num[i]+num[j]>0)
                break;
            k = num.size()-1;
            while(j<k)
            {
            if(num[i]+num[j]+num[k] == 0)
            {
                if(sum.size()==0 || sum.size()>0 && !(num[i]==sum[sum.size()-1][0]&& num[j] ==sum[sum.size()-1][1] ))
                {
                vector<int> ansPiece;
                ansPiece.push_back(num[i]);
                ansPiece.push_back(num[j]);
                ansPiece.push_back(num[k]);
                sum.push_back(ansPiece);
                }
            }
            if(num[i]+num[j]+num[k] < 0)
                j++;
            else
                k--;
            }
        }
        return sum;
    }
};
时间: 2024-10-02 01:21:05

leetcode第15题--3Sum的相关文章

[LeetCode][Python]15:3Sum

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 15: 3Sumhttps://oj.leetcode.com/problems/3sum/ Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0?Find all unique triplets in the array which gives the sum

LeetCode第15题 三数之和

/* 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]*/ /* 思路: 首先想到的肯定是穷举,时间复杂度为O(n^3) , 但如果使用这种方法,也实在称不上算法题了,果不其然,超时. [

leetcode:1-5题代码整理

以下是这段时间抽时间刷的前5题,都是自己想的解法,或许不是最优解,只是整理下,方便日后优化提升 1. Two Sum: class Solution: # @return a tuple, (index1, index2) def twoSum(self, num, target): dict = {} for i in xrange(len(num)): if dict.get(target-num[i], None) == None: dict[num[i]] = i else: retur

leetcode第16题--3Sum Closest

Problem:Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S

LeetCode题解 15题 第二篇

之前写过一篇,这是第二篇.上一篇用了多种编程语言来做,这一次是以学算法为主,所以打算都用python来完成. 4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log

LeetCode(15) 3Sum

题目 Given an array S of n integers, are there elements a, b, c 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 so

【LeetCode每天一题】3Sum(三数之和)

Given an array nums of n integers, are there elements a, b, c in nums 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. Example: Given array nums =

leetcode中第一题twosum问题解答算法的可行性证明

leetcode中第一题twosum问题解答算法的可行性证明 一.引入 关于leetcode中第一题twosum问题,网上已有不少高人做出过解答,并提出了切实可行的算法实现.我在解答该题时参考了博客http://www.zixue7.com/article-9576-1.html的解答.为让读者更直观地阅读和理解本文,先简要摘录以上博客的内容如下: 题目还原 Two Sum Given an array of integers, find two numbers such that they a

leetcode -day 15 Distinct Subsequences

1.  Distinct Subsequences Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters with