就是在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;
}
}