3Sum

Posted xpp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3Sum相关的知识,希望对你有一定的参考价值。

方法一:不进行夹逼,直接使用类似2Sum的方法,使用一个hashTable,键值对应vector中的数值,value对应vector对用数值的索引,这其中有一个小trick:最外层的循环需要出力重复数字,但是再深一层的循环判断重复数字时需要避开最外层循环的数字,如处理(-1, -1, 2)这种情况

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int> > result;
        if(nums.size() < 3)
            return result;
            
        sort(nums.begin(), nums.end());
        
        unordered_map<int, int> hashTable;
        for(int i=0; i<nums.size(); ++i)
            hashTable[nums[i]] = i;
        
        for(int i=0; i<nums.size();++i)
        {
            if(i>0 && nums[i] == nums[i-1])
                continue;
                
            for(int j=i+1; j<nums.size(); ++j)
            {
                if(j>(i+1) && nums[j] == nums[j-1])
                    continue;
                    
                if((hashTable.find(-(nums[i] + nums[j])) != hashTable.end()) && (hashTable[-(nums[i] + nums[j])] > j))
                {
                    result.push_back({nums[i], nums[j], -(nums[i] + nums[j])});
                }
            }
        }
        
        return result;
    }
};

方法二,排序后夹逼

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

 

以上是关于3Sum的主要内容,如果未能解决你的问题,请参考以下文章

3sum

leetcode 15. 3Sum

leet_3Sum

leetcode16 3Sum Closest

259. 3Sum Smaller小于版3sum

15 & 16. 3Sum & 3Sum Cloest