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;
    }
}

 

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