Skip to content

Instantly share code, notes, and snippets.

@bunnyadad
Last active April 29, 2019 01:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bunnyadad/b8e10676095e6b702e83fdc5da483653 to your computer and use it in GitHub Desktop.
Save bunnyadad/b8e10676095e6b702e83fdc5da483653 to your computer and use it in GitHub Desktop.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> fourSum(vector<int> nums, int target)
{
if (nums.size() < 4) return{};
sort(nums.begin(), nums.end());
vector<vector<int>> output;
for (size_t i = 0; i < nums.size() - 3; i++)
{
if (i != 0 && nums[i] == nums[i - 1]) continue;
if (target < (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3])) break;
if (target >(nums[i] + nums[nums.size() - 1] + nums[nums.size() - 2] + nums[nums.size() - 3])) continue;
for (size_t j = i + 1; j < nums.size() - 2; j++)
{
if (j != i + 1 && nums[j] == nums[j - 1]) continue;
if (target < (nums[i] + nums[j] + nums[j + 1] + nums[j + 2])) break;
if (target >(nums[i] + nums[j] + nums[nums.size() - 1] + nums[nums.size() - 2])) continue;
size_t front = j + 1;
size_t back = nums.size() - 1;
int sum = target - nums[i] - nums[j];
while (front < back)
{
if (nums[front] + nums[back] == sum)
{
output.push_back({ nums[i], nums[j], nums[front], nums[back] });
while ((front < back) && nums[front] == nums[front + 1]) front++;
while ((back < front) && nums[front] == nums[back - 1]) back--;
front++; back--;
}
else if (nums[front] + nums[back] < sum) front++;
else back--;
}
while ((j < nums.size() - 2) && nums[j] == nums[j + 1]) j++;
}
while ((i < nums.size() - 3) && nums[i] == nums[i + 1]) i++;
}
return output;
}
};
int main()
{
Solution s;
auto o = s.fourSum({ -1, -5, -5, -3, 2, 5, 0, 4 }, -7);
return 0;
}
@bunnyadad
Copy link
Author

first version:
Runtime: 44 ms
Memory: 9.2 MB

@bunnyadad
Copy link
Author

second version:
Runtime: 8 ms, faster than 100.00% of C++ online submissions for 4Sum.
Memory Usage: 9.4 MB, less than 100.00% of C++ online submissions for 4Sum.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment