diff --git a/more/0015.cpp b/more/0015.cpp new file mode 100644 index 0000000..f7267c6 --- /dev/null +++ b/more/0015.cpp @@ -0,0 +1,39 @@ +#include +#include + +struct tripletHash { + std::size_t operator()(const std::vector& v) const { + return (size_t(v[0]) << 36) ^ (size_t(v[1]) << 18) ^ size_t(v[2]); + } +}; + +class Solution { +public: + static std::vector> threeSum(std::vector& nums) { + std::vector> ret; + std::sort(nums.begin(), nums.end()); + std::unordered_set s(nums.begin(), nums.end()); + for (auto it = std::upper_bound(nums.begin(), nums.end(), 0); it != nums.end(); ++it) + for (auto it2 = std::next(it); it2 != nums.end(); ++it2) + if (s.count(-(*it + *it2))) + ret.push_back({-(*it + *it2), *it, *it2}); + for (auto it = nums.begin(), lim = std::lower_bound(nums.begin(), nums.end(), 0); it != lim; ++it) + for (auto it2 = std::next(it); it2 != lim; ++it2) + if (s.count(-(*it + *it2))) + ret.push_back({*it, *it2, -(*it + *it2)}); + if (s.count(0)) + for (auto it = std::upper_bound(nums.begin(), nums.end(), 0); it != nums.end(); ++it) + if (s.count(-*it)) + ret.push_back({-*it, 0, *it}); + if (3 <= std::distance(std::lower_bound(nums.begin(), nums.end(), 0), std::upper_bound(nums.begin(), nums.end(), 0))) + ret.push_back({0, 0, 0}); + std::unordered_set, tripletHash> retSet(ret.begin(), ret.end()); + return {retSet.begin(), retSet.end()}; + } +}; + +int main() { + std::vector args = {1,1,-2}; + auto ret = Solution::threeSum(args); + return 0; +} diff --git a/more/CMakeLists.txt b/more/CMakeLists.txt index 3ab0542..aa5b425 100644 --- a/more/CMakeLists.txt +++ b/more/CMakeLists.txt @@ -3,4 +3,4 @@ PROJECT(more) SET(CMAKE_CXX_STANDARD 23) -ADD_EXECUTABLE(more 0005.cpp) +ADD_EXECUTABLE(more 0015.cpp)