1. 程式人生 > >Leetcode 473.火柴拼正方形

Leetcode 473.火柴拼正方形

size 之間 num continue lee int turn import arrays

火柴拼正方形

還記得童話《賣火柴的小女孩》嗎?現在,你知道小女孩有多少根火柴,請找出一種能使用所有火柴拼成一個正方形的方法。不能折斷火柴,可以把火柴連接起來,並且每根火柴都要用到。

輸入為小女孩擁有火柴的數目,每根火柴用其長度表示。輸出即為是否能用所有的火柴拼成正方形。

示例 1:

輸入: [1,1,2,2,2]

輸出: true

解釋: 能拼成一個邊長為2的正方形,每邊兩根火柴。

示例 2:

輸入: [3,3,3,3,4]

輸出: false

解釋: 不能用所有火柴拼成一個正方形。

註意:

  1. 給定的火柴長度和在 0 到 10^9之間。
  2. 火柴數組的長度不超過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         int
sum=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.火柴拼正方形