力扣-15三数之和3Sums

题目、例子

力扣-15三数之和3Sums_第1张图片

思路

  1. 每次都fix一个值,然后在除fix值之外的数组中找到两数之和等于0-fix的值,在代码中记为target变量
  2. 先将数组进行排序,这样不但可以简单的去掉重复target的情况,而且由于是从负数到正数排列的,如果从第一个开始找的就是正数情况的话就可以直接break掉
  3. 所以在跳过重复数字情况下:
    3.1. 先排序
    3.2. 设置头尾两个指针i,j
    3.3. 如果两数相加大于target,则j指针往前移一个; 如果小于target,则i往后移一个

代码

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; //第一个数就大于0了,不可能再有结果了
            if(k>0 && nums[k] == nums[k-1])continue;//-target数与前一个数相同,直接跳过
            int target = 0- nums[k], i = k+1, j = (int)nums.size()-1;//设置两个指针来寻找target
            while(i<j)
            {
                if(nums[i] + nums[j] == target)
                {
                    res.push_back({nums[k],nums[i], nums[j]});
                    //i,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;

    }
};

你可能感兴趣的:(leetcode顺序做题)