473. Matchsticks to Square

    xiaoxiao2021-03-25  102

    用这种amazing的方式,竟然一次AC了,也是吃惊。我的解决方式是,先将数据对分,再判断对分后的两组数据是不是能再次对分。所以写了两个DFS函数,以及一个计算剩余数字的函数。 本以为运行速度会很慢,结果发现起始还算快的。

    class Solution { public: vector<int> getLeft(vector<int>& temp,vector<int>& nums) { int tempIndex=0; int numIndex=0; vector<int> left; while(numIndex<nums.size()&&tempIndex<temp.size()) { if(nums[numIndex]==temp[tempIndex]) { tempIndex++; numIndex++; } else if(nums[numIndex]<temp[tempIndex]) { left.push_back(nums[numIndex]); numIndex++; } else//imposible {} } while(numIndex<nums.size()) left.push_back(nums[numIndex++]); return left; } void divide(int start,int sum,int target,vector<int>& nums,vector<int>& temp,set<vector<int>>& result) { if(target==sum) { result.insert(temp); } else if(target>sum) { for(int i=start;i<nums.size();i++) { temp.push_back(nums[i]); divide(i+1,sum+nums[i],target,nums,temp,result); temp.pop_back(); } } else{} return; } bool divide2(int start,int sum,int target,vector<int>& nums) { if(target==sum) { return true; } else if(target>sum) { for(int i=start;i<nums.size();i++) { if(divide2(i+1,sum+nums[i],target,nums)) return true; } } else{} return false; } bool makesquare(vector<int>& nums) { int sum=0; for(int i=0;i<nums.size();i++) sum+=nums[i]; if(sum%4!=0||sum==0||nums.size()<4) return false; int quarter=sum/4; int half=sum/2; sort(nums.begin(),nums.end()); vector<int> temp; set<vector<int>> result; divide(0,0,half,nums,temp,result); //get result for(set<vector<int>>::iterator it=result.begin();it!=result.end();it++) { vector<int> temp=*it;//temp---nums vector<int> left=getLeft(temp,nums); /* for(int i=0;i<temp.size();i++) cout<<temp[i]<<" "; cout<<"//"; for(int i=0;i<left.size();i++) cout<<left[i]<<" "; cout<<"//"; */ if(divide2(0,0,quarter,temp)&÷2(0,0,quarter,left)) return true; } return false; } };
    转载请注明原文地址: https://ju.6miu.com/read-17962.html

    最新回复(0)