leedcode 15 三数之和

先确定一个数A再寻找两个数B、C之和A的相反数
为避免对遍历所有两个数的组合 – 排序
如果遍历到大于0的数直接break – 和不可能为0
如果两数之和等于target – 放入答案 左侧 i++ 并且右侧 j–
如果两数之和小于target – 让和变大 左侧 i++
如果两数之和大于target – 让和变小 左侧 i++ 并且右侧 j–

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(),nums.end());  
        if (nums.empty() || nums.back() < 0 ||nums.front()>0) return {};
        for (int k = 0; k <(int)nums.size() -2;++k){   
            if(nums[k] > 0) break;
            if(k > 0 && nums[k]==nums[k-1])continue;
            int target = 0 - nums[k], i = k + 1, j = (int)nums.size() - 1;
            while(i<j) {
                if(nums[i] + nums[j] == target)
                {
                    res.push_back({nums[k], nums[i],nums[j]});
                    while (i < j && nums[i] == nums[i + 1]) ++i;
                    while (i < j && nums[j] == nums[j -  1]) --j;
                    ++i;
                    --j;
                } else if (nums[i] + nums[j] < target) ++i;
                else --j;
            }
        }
        return res;
    }
};
发布了34 篇原创文章 · 获赞 0 · 访问量 598

猜你喜欢

转载自blog.csdn.net/Luyoom/article/details/103050291
今日推荐