leetcode15. 三数之和(哈希表unordered_map、双指针)

题目描述:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如,给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:

[ [-1, 0, 1], [-1, -1, 2] ]

方法一:哈希表

想法类似于两数之和,在本题中,已知前两个数,查找数组中是否存在-a-b

#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;

class Solution{
public:
    vector<vector<int>> threeSum(vector<int>& nums){
        vector<vector<int>> result;
        if(nums.size() == 0)
            return result;
        sort(nums.begin(), nums.end());  //对数组排序是为了后续去重 
        for(int i=0; i<nums.size(); ++i){
            if(i!=0 && nums[i] == nums[i-1])
                continue;
            unordered_map<int, int> map;
            for(int j=i+1; j<nums.size(); ++j){
                if(map.find(-nums[i]-nums[j]) != map.end()){
                    result.push_back({nums[i], nums[j], -nums[i]-nums[j]});
                    while(j+1 < nums.size() && nums[j] == nums[j+1])
                        j++;
                }
                map.insert({nums[j], j});
            }
        }
        return result;
    }
};

int main(){
    Solution solution;
    vector<int> vec;
    int i;
    do{
        cin>>i;
        vec.push_back(i);
    }while(getchar() != '\n');
    vector<vector<int>> result;
    result = solution.threeSum(vec);
    int rows = result.size();
    int columns = result[0].size();
    for(int i=0; i<rows; ++i)
        for(int j = 0; j<columns; ++j){
            cout<<result[i][j]<<" ";
        }
    cout<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/jiangyaju/p/11074503.html