leetcode 15 3sum

https://leetcode.com/problems/3sum/

2sum:找到一组两元组,使得和为某个数

先排序,假设从小到大排序后,设头尾两个指针,若当前指针指向元素和小于零 则移动指针增大元素,反之大于零 则减小元素

3sum:找所有的三元组,使得三者和为零

n^2做法  先排序,固定一个点,将问题转化为2sum问题

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans; 
        sort(nums.begin(), nums.end());
        vector<int>temp(3, 0);
        for(int i = 0; i < nums.size(); i++){
            if(i && nums[i] == nums[i - 1])
                continue;//去重
            int le = i + 1, ri = nums.size() - 1;
            temp[0] = nums[i];
            while(le < ri){
                int sum = nums[i] + nums[le] + nums[ri];
                if(sum < 0){
                    le++;
                }
                else if(sum > 0){
                    ri--;
                }
                else{
                    temp[1] = nums[le];
                    temp[2] = nums[ri];
                    ans.push_back(temp);
                    while(le < ri && nums[le] == temp[1]) le++;//去重
                    while(le < ri && nums[ri] == temp[2]) ri--;//去重
                }
            }
        }
        return ans;
    }
};

 

上一篇:3sum 求三数之和等于0,不允许重复


下一篇:0498. Diagonal Traverse (M)