力扣刷题:18. 四数之和

题目要求

力扣刷题:18. 四数之和
很喜欢评论区里面的一个评论:高端的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;
}

};
上一篇:python教程 面向对象 多态


下一篇:dom4j 通过 org.dom4j.DocumentFactory 设置命名空间来支持 带namespace 的 xpath