题目背景:
========================================================================================================
算法思想:
//题目要求是不含重复元素的四元组
//算法思想:
// 先用两层嵌套for循环找到第一个和第二个不重复的数字,再用双指针(左右指针)的思想找到第三个和第四个数字;
//四个数字依次是nums[k],nums[i],nums[left],nums[right];
//第一个和第二个数字的去重逻辑是直接用continue跳出当前循环。
//第三个和第四个数字的去重逻辑是通过左移,右移实现跳过重复的数字。
代码实现
class Solution
{
public:
vector<vector<int>>fourSum(vector<int>& nums, int target)
{
vector<vector<int>>res;
sort(nums.begin(), nums.end());
for (int k = 0; k < nums.size(); k++) //------- 第一层for循环
{
if (k > 0 && nums[k] == nums[k - 1])continue;//遇到相同的数字直接跳过;continue只是跳出本次循环
for (int i = k + 1; i < nums.size() ;i++)//---------------------第二层for循环
{
if (i > k + 1 && nums[i]==nums[i - 1])continue;//遇到相同的数直接跳过
//双指针找第三个第四个数字
int left = i + 1;
int right = nums.size() - 1;
while (left < right)
{
if (nums[k] + nums[i] + nums[left] + nums[right] > target)right--;//右移缩小
else if (nums[k] + nums[i] + nums[left] + nums[right] < target)left++;//左移增大
else
{
res.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});//保存满足条件的四个数字
//去重逻辑
while (left < right && nums[right] == nums[right - 1])right--;
while (left < right && nums[left] == nums[left + 1])left++;
right--;
left++;
}
}
}
}
return res;
}
};
解题感受:
这种for循环遍历求解的方式还是很容易理解的,为了避免多层for循环带来时间复杂度过大,使用左右之指针寻找第三个和第四个数字的思路也是很巧妙。