天天看点

LeetCode:18. 四数之和(C++带详细注释)

LeetCode:18. 四数之和(C++带详细注释)

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>>res;//预定义结果数组
        int len=nums.size();//获取数组长度;
        sort(nums.begin(),nums.end());//排序
        for(int a=0;a<len-3;a++)//第一层循环
        {
           if(a>0&&nums[a]==nums[a-1]) continue;//a遍历中遇到和上一个一样的数跳过,防止res重复
            for(int b=a+1;b<len-2;b++)//第二层循环
            {
                 if(b>a+1&&nums[b]==nums[b-1]) continue;//b遍历和a一样
                 int c=b+1,d=len-1;//定义2个移动指针,指向第b+1和最后一个元素
                 while(c<d)//循环直到c==d
                 {
                     int sum=nums[a]+nums[b]+nums[c]+nums[d];//四数之和
                     if(sum<target) //小了,c后移一位,巧妙判断
                     while(c<d&&nums[c]==nums[++c]);//并跳过相等项  
                     else if(sum>target) //大了,d前移一位
                     while(c<d&&nums[d]==nums[--d]);//并跳过相等项  
                     else//相等
                     {
                         res.push_back(vector<int>{nums[a],nums[b],nums[c],nums[d]});//放入结果
                         while(c<d&&nums[c]==nums[++c]);//c遍历遇到和前一个重复跳过
                         while(c<d&&nums[d]==nums[--d]);//相等后,c,d都要变,只变一个会重复

                     }
                 }
            }
        }
        return res;//返回结果数组

    }
};