题目要求
很喜欢评论区里面的一个评论:高端的coder往往用最朴素的解法。
这题和15题“三数之和”类似,只是三个数变成了四个数,还是双指针。
整体思路
用两重for循环选取first和second。
在第二重循环中初始化forth为数组的最后一个元素
利用双指针在第三重for循环中寻找third和forth:
如果 sum(四数之和) > target, 说明当前的数太大了,需要向前移动forth来减小数值
如果 sum < target, 说明当前数太小了,需要向后移动third来增加数值
如果 sum = target,在验证结果不重复后将其存入结果容器中
代码:双指针
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target)
{
if (nums.size() < 4)
{
return {};
}
vector<vector<int>> v;
std::sort(nums.begin(), nums.end());
for (size_t first = 0; first < nums.size() - 3; first++)
{
//跳过重复值
if (first > 0 && nums.at(first - 1) == nums.at(first))
{
continue;
}
for (size_t second = first + 1; second < nums.size() - 2; second++)
{
if (second > first + 1 && nums.at(second - 1) == nums.at(second))
{
continue;
}
int forth = nums.size() - 1;
for (size_t third = second + 1; third < forth; third++)
{
while (third < forth && nums[first] + nums[second] + nums[third] + nums[forth] > target)
{
--forth;
}
if (third == forth)
{
break;
}
if (nums[first] + nums[second] + nums[third] + nums[forth] == target)
{
vector<int> temp = { nums[first], nums[second], nums[third], nums[forth] };
if (!valueInVector(v, temp))
{
v.push_back(temp);
}
}
}
}
}
return v;
}
//判断容器中是否已经含有相同值
bool valueInVector(vector<vector<int>>& v, vector<int>& value)
{
for (auto i : v)
{
if (i[0] == value[0] && i[1] == value[1] && i[2] == value[2] && i[3] == value[3])
{
return true;
}
}
return false;
}
};