473.matchsticks-to-square.go 637 B

12345678910111213141516171819202122232425262728293031
  1. func makesquare(nums []int) bool {
  2. n := len(nums)
  3. if n < 4 {
  4. return false
  5. }
  6. sum := 0
  7. for _, i := range nums {
  8. sum += i
  9. }
  10. if sum%4 != 0 {
  11. return false
  12. }
  13. sort.Sort(sort.Reverse(sort.IntSlice(nums))) // It's super effective!
  14. return dfs(nums, make([]int, 4), n, 0, sum/4)
  15. }
  16. func dfs(nums []int, sums []int, n int, idx int, target int) bool {
  17. if idx == n {
  18. return sums[0] == target && sums[1] == target && sums[2] == target
  19. }
  20. for i := 0; i < 4; i++ {
  21. if sums[i]+nums[idx] <= target {
  22. sums[i] += nums[idx]
  23. if dfs(nums, sums, n, idx+1, target) {
  24. return true
  25. }
  26. sums[i] -= nums[idx]
  27. }
  28. }
  29. return false
  30. }