leetcode-473 火柴拼正方形
Posted lazy pig~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-473 火柴拼正方形相关的知识,希望对你有一定的参考价值。
class Solution { public: bool makesquare(vector<int>& nums) { int l=nums.size(); int sum=0; for(int i=0;i<l;i++) { sum+=nums[i]; } if(sum==0 || (sum/4)*4 !=sum) { return false; } vector<int> data; for(int i=0;i<4;i++) { data.push_back(0); } return dfs(nums,data,0,sum/4);//可以看成把所有火柴分为四组 } bool dfs(vector<int>& nums,vector<int>& data,int index,int temp)//对每个火柴以此判断,放在哪个组里,然后回溯。 { if(index==nums.size()) { return data[0]==temp && data[1]==temp && data[2]==temp; } for(int i=0;i<4;i++) { if(data[i]+nums[index]<=temp) { data[i]+=nums[index]; if (dfs(nums,data,index+1,temp)) { return true; } data[i]-=nums[index]; } } return false; } };
可能是因为复杂度为4的N次幂,复杂度太大了,所以超时了。
加个剪枝,按从大到小排序,然后再处理,可以减少许多计算量。
class Solution { public: bool makesquare(vector<int>& nums) { int l=nums.size(); int sum=0; for(int i=0;i<l;i++) { sum+=nums[i]; } if(sum==0 || (sum/4)*4 !=sum) { return false; } vector<int> data; for(int i=0;i<4;i++) { data.push_back(0); } sort(nums.rbegin(),nums.rend()); //反向排序 rbegin,rend return dfs(nums,data,0,sum/4); } bool dfs(vector<int>& nums,vector<int>& data,int index,int temp) { if(index==nums.size()) { return data[0]==temp && data[1]==temp && data[2]==temp; } for(int i=0;i<4;i++) { if(data[i]+nums[index]<=temp) //在此处剪枝 { data[i]+=nums[index]; if (dfs(nums,data,index+1,temp)) { return true; } data[i]-=nums[index]; } } return false; } };
以上是关于leetcode-473 火柴拼正方形的主要内容,如果未能解决你的问题,请参考以下文章