Leetcode 473.火柴拼正方形
阿新 • • 發佈:2019-01-17
size 之間 num continue lee int turn import arrays
火柴拼正方形
還記得童話《賣火柴的小女孩》嗎?現在,你知道小女孩有多少根火柴,請找出一種能使用所有火柴拼成一個正方形的方法。不能折斷火柴,可以把火柴連接起來,並且每根火柴都要用到。
輸入為小女孩擁有火柴的數目,每根火柴用其長度表示。輸出即為是否能用所有的火柴拼成正方形。
示例 1:
輸入: [1,1,2,2,2]
輸出: true
解釋: 能拼成一個邊長為2的正方形,每邊兩根火柴。
示例 2:
輸入: [3,3,3,3,4]
輸出: false
解釋: 不能用所有火柴拼成一個正方形。
註意:
- 給定的火柴長度和在 0 到 10^9之間。
- 火柴數組的長度不超過15。
想象正方形的4條邊是4個桶,將每個火柴棍回溯放置在每個桶中,放完N個後,檢查4個桶中的長度和是否相同
優化剪枝:
1.N個火柴棍的總和對4取余是不是0,不是的話返回假
2.長度按照從大到小排序,先嘗試長的,減少回溯的可能
3.每次放置時,每條邊上不可放置超過總和1/4長度的火柴棍
1 import java.util.Arrays; 2 3 class Solution { 4 public boolean makesquare(int[] nums) { 5 if(nums.length<4) return false; 6 intsum=0; 7 for(int i=0;i<nums.length;i++) sum+=nums[i]; 8 if(sum%4!=0) return false; 9 Arrays.sort(nums); 10 int[] bucket=new int[4]; 11 return generate(0,nums,sum/4,bucket); 12 } 13 14 public boolean generate(int i,int[] nums,int target,int[] bucket){15 if(i==nums.length) return bucket[0]==target&&bucket[1]==target&&bucket[2]==target&&bucket[3]==target; 16 for(int j=0;j<4;j++){ 17 if(bucket[j]+nums[i]>target) continue; 18 bucket[j]+=nums[i]; 19 if(generate(i+1,nums,target,bucket)) return true; 20 bucket[j]-=nums[i]; 21 } 22 return false; 23 } 24 }
Leetcode 473.火柴拼正方形