15. 3Sum

原创 2016年08月29日 22:03:42

先枚举前两个数,再看第三个数在不在,在这里主要需处理好重复的问题,所以先排好序,若第一个数字相同,跳过,若第二个数字想同,也跳过

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n=nums.size();
        int i,j,k,length;
        int ans;
        sort(nums.begin(),nums.end());
        unordered_map<int,int> mp;
        vector<vector<int>> res;
        
        for(i=0;i<n;i++)
            mp[nums[i]]=i;
            
        for(i=0;i<=n-3;i++)
        {
            if(i>0&&nums[i]==nums[i-1])
                continue;
            for(j=i+1;j<n;j++)
            {
                if(j>i+1&&nums[j]==nums[j-1])
                    continue;
                int d=nums[i]+nums[j];
                if(d>0)
                    break;
                if(mp.find(-d)!=mp.end())
                {
                    k=mp[-d];
                    if(k<=j)
                        break;
                    vector<int> vt;
                    vt.push_back(nums[i]);
                    vt.push_back(nums[j]);
                    vt.push_back(nums[k]);
                    res.push_back(vt);
                }
            }
        }
        return res;   
    }
};



另一种方法,不需要空间开销,二分查找,枚举第一个数,第一个数从左端开始找,第二个数从右端开始找

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n=nums.size();
        int i,j,k;
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        
        for(i=0;i<=n-3;i++)
        {
            if(i>0&&nums[i]==nums[i-1])
                continue;
            for(j=i+1,k=n-1;j<k;)
            {
                if(j>i+1&&nums[j]==nums[j-1])
                {
                    j++;
                    continue;
                }
                if(k<n-1&&nums[k]==nums[k+1])
                {
                    k--;
                    continue;
                }
                int d=nums[i]+nums[j]+nums[k];
                if(d==0)
                {
                    vector<int> vt;
                    vt.push_back(nums[i]);
                    vt.push_back(nums[j]);
                    vt.push_back(nums[k]);
                    res.push_back(vt);
                    j++;
                    k--;
                }
                else if(d>0)
                    k--;
                else if(d<0)
                    j++;
            }
        }
        return res;   
    }
};



LeetCode 15 3Sum(3个数的和)

翻译给定一个有n个整数的数组S,是否存在三个元素a,b,c使得a+b+c=0? 找出该数组中所有不重复的3个数,它们的和为0。备注: 这三个元素必须是从小到大进行排序。 结果中不能有重复的3个数。例如...
  • NoMasp
  • NoMasp
  • 2015年10月17日 23:19
  • 3478

leetcode解题之 15. 3Sum Java版(结果为目标值的三个数字)

leetcode解题之 15. 3Sum Java版(结果为目标值的三个数字)
  • mine_song
  • mine_song
  • 2017年04月06日 18:29
  • 239

【LeetCode】3Sum 解题报告

这道题凭我现有知识实在解答不上来,只好网上搜索解法,才发现 K Sum 是一类问题,但是网上没有比较简洁的代码,我想对于初学者来说,可能还是想先看看这道题怎么解,然后才有兴趣去看其扩展吧。 【题目】 ...
  • ljiabin
  • ljiabin
  • 2014年10月30日 16:00
  • 28098

15. 3sum(重要)

15. 3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...
  • gao1440156051
  • gao1440156051
  • 2016年08月24日 16:41
  • 263

Leetcode刷题记——15. 3Sum(3个数字和)

一、题目叙述: Given an array S of n integers, are there elements a, b, c in S such ...
  • sunshine0_0
  • sunshine0_0
  • 2016年11月02日 16:31
  • 136

LeetCode 15. 3Sum(三数之和)

原题网址:https://leetcode.com/problems/3sum/ Given an array S of n integers, are there elements a, ...
  • jmspan
  • jmspan
  • 2016年05月19日 06:03
  • 364

【Leetcode 15】3Sum 三数和问题 C++

leetcode15 threeSum 三数和问题,C++
  • u010656539
  • u010656539
  • 2016年08月14日 15:30
  • 1731

LeetCode 3Sum 三个数和为零的集合 C++完整程序

掌握了这样的题的要诀就好办: 1 排序 2 前面的两个小数和后面的一个大数相加比较,如果小于0,那么前面的数往前进,增大; 如果大于0,那么后面的数往前进,减小。 3 前面的数和后面的数相遇,本...
  • kenden23
  • kenden23
  • 2013年11月24日 19:11
  • 4296

15. 3Sum hash解法 vs 双指针解法

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...
  • djgjmtdmjt
  • djgjmtdmjt
  • 2017年01月05日 00:45
  • 213

【算法】2SUM/3SUM/4SUM问题

之前就总结过一些Leetcode上各种sum问题,今天再拿出来完整得总结一番。 nSUM问题是指,在一个数组中,找出n个数相加和等于给定的数,这个叫做nSUM问题。 常见的有2SUM,3...
  • haolexiao
  • haolexiao
  • 2017年04月26日 01:21
  • 1810
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:15. 3Sum
举报原因:
原因补充:

(最多只允许输入30个字)