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;//返回结果数组
}
};