leetcode 15

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
};

猜你喜欢

转载自blog.csdn.net/artisans/article/details/88820138
今日推荐