标签:四数 third nums 18 力扣 second size forth first
题目要求
很喜欢评论区里面的一个评论:高端的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;
}
};
标签:四数,third,nums,18,力扣,second,size,forth,first 来源: https://blog.csdn.net/youyadefeng1/article/details/115347361
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。