①将数组升序排序,贪心选择长的构建边,这样每次构建边的时候不用考虑有多种情况。
②只需要构建三条边即可,因为之前已经对变长进行了判定。
抄的别人的代码:
class Solution {
public:
bool dfs(vector<int> &nums,int curLen)
{
if(curLen==0) return true;
for(int i=0;i<nums.size();++i)
{
if(nums[i]>curLen) return false;
if(nums[i]>0)
{
int tmp=nums[i];
nums[i]=0; //访问后就置为0
if(dfs(nums,curLen-tmp))
return true;
nums[i]=tmp; //恢复
}
}
return false;
}
bool makesquare(vector<int>& nums) {
if(nums.size()<4) return false;
int sum=accumulate(nums.begin(),nums.end(),0);
if(sum%4) return false; //余数不为零一定不能构成
sort(nums.begin(),nums.end(),greater<int>()); //升序排序,贪心选择长的构建边
for(int i=0;i<3;++i) //只需判断是否构建出3条长为sum/4的边长
{
if(!dfs(nums,sum/4)) return false;
}
return true;
}
};