leetcode473 Matchsticks to Square
2018-08-10 16:44 legend聪 阅读(271) 评论(0) 编辑 收藏 举报一开始想求所有结果为target的组合来着,但是所选元素不能重叠。用这个递归思想很简单,分成四个桶,每次把元素放在任意一个桶里面,最后如果四个桶相等就可以放进去,有一个地方可以剪枝,假如任意一个桶的元素和大于了target果断return。另一个优化的点在于,如果要求能不能也就是找到一个就可以的话,那么从大到小的找可以减少回溯的次数,否则会超时。学会了一个sort函数从大到小排序的新方法。sort(nums.rbegin(),nums.rend()); leetcode不能用sort(,,cmp)的那种方法不知道为什么。
#include<bits/stdc++.h> using namespace std; class Solution { private: vector<int>ans; vector<vector<int>>res; vector<bool>used; bool cmp(int a, int b) { return a > b; } bool permutation(vector<int>nums, int index, int n,int a,int b,int c,int d) { if (a>n/4||b>n/4||c>n/4||d>n/4) return false; if (index==nums.size()&&a==b&&c==d&&b==c) { return true; } return permutation(nums, index + 1, n, a + nums[index], b, c, d) || permutation(nums, index + 1, n, a, b + nums[index], c, d) || permutation(nums, index + 1, n, a, b, c + nums[index], d) || permutation(nums, index + 1, n, a, b, c, d + nums[index]); } public: bool makesquare(vector<int>& nums) { if (nums.size() == 0) return false; int sum=0; int i; sort(nums.rbegin(),nums.rend()); for (i = 0; i < nums.size(); i++) { sum += nums[i]; } if (sum % 4 != 0||nums[nums.size()-1]>sum/4) return false; return permutation(nums, 0, sum,0,0,0,0); } };