版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/artisans/article/details/88820138
//从nums中选取三个不同的数字,
void dfs(int index, int avli, vector<int>& nums, vector<int>& flags)
{
if (avli == 0)
{
foo(nums, flags);
}
else
{
for (int i = index; i < nums.size(); i++)
{
flags[i] = 1;
if(trim(nums, flags, i, avli))
dfs(i + 1, avli - 1, nums, flags);
flags[i] = 0;
}
}
}
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
long t = clock();
sort(nums.begin(), nums.end());
vector<int> flags(nums.size(), 0);
dfs(0, 3, nums, flags);
cout << "TIME " << (clock() - t) << "\n";
return _ret;
}
bool trim(vector<int>& nums, vector<int>& flags, int index, int avli)
{
if (avli == 1)
{
if (nums[index] < 0) return false;
}
vector<int> TEMP;
for (int i = 0; i < nums.size(); i++)
{
if (flags[i])
{
TEMP.push_back(nums[i]);
//cout << nums[i] << "\t";
}
}
//cout << "\n";
int sum = std::accumulate(TEMP.begin(), TEMP.end(), 0);
if ( sum > 0)
{
if (nums[index] > 0)
return false;
}
//if (avli == 1 && nums[index] > std::abs(sum))
// return false;
return true;
}
void foo(vector<int>& nums, vector<int>& flags)
{
vector<int> TEMP;
for (int i = 0; i < nums.size(); i++)
{
if (flags[i])
{
TEMP.push_back(nums[i]);
}
}
if (std::accumulate(TEMP.begin(), TEMP.end(), 0) == 0)
{
sort(TEMP.begin(), TEMP.end());
if (_set.find(TEMP) == _set.end())
{
_ret.push_back(TEMP);
_set.insert(TEMP);
for (int v : TEMP)
{
cout << v << "\t";
}
cout << "\n";
}
}
}
set<vector<int>> _set;
vector<vector<int>> _ret;
};