leetcode 473 火柴棍摆正方形(java 搜索)

 

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章