就是在N个数里面找出四组数,使得每一组的和都是相等的
优化很容易想到,就是先总和除以4取余,不为0说明不能成正方形,因为不能折断
然后从大到小排序,每一次判断当前值和平均值的关系
大于,就不能拼成正方形,直接false;等于,一条边完成摆放,进行下一条边;小于,记录这个火柴,继续搜,看有没有火柴长度和它加起来能够到达平均值,没有就false
class Solution {
public boolean makesquare(int[] nums) {
if(nums==null||nums.length<4){
return false;
}
//提前判断是否有可能是正方形
int sum_num=0;
for(int i:nums){
sum_num+=i;
}
if(sum_num==0||sum_num%4 !=0){
return false;
}
Arrays.sort(nums);//这个排序默认是升序的
return canMake(nums.length-1,nums,new int[4],sum_num/4);
}
//要记录每个边的长度sum[i] pos-数组nums中的位置
private boolean canMake(int pos,int[]nums,int[]sum,int average){
if(pos<0){//nums数组遍历完毕
//是否每个长度都相等
return (sum[0]==average &&sum[1]==average&&sum[2]==average);
}
for(int i=0;i<4;i++){//四条边分别尝试
if(sum[i]+nums[pos]>average){
continue;
}
sum[i]+=nums[pos];
if(canMake(pos-1,nums,sum,average)){
return true;
}
//回溯
sum[i]-=nums[pos];
}
return false;
}
}