12345678910111213141516171819202122232425262728293031 |
- func makesquare(nums []int) bool {
- n := len(nums)
- if n < 4 {
- return false
- }
- sum := 0
- for _, i := range nums {
- sum += i
- }
- if sum%4 != 0 {
- return false
- }
- sort.Sort(sort.Reverse(sort.IntSlice(nums))) // It's super effective!
- return dfs(nums, make([]int, 4), n, 0, sum/4)
- }
- func dfs(nums []int, sums []int, n int, idx int, target int) bool {
- if idx == n {
- return sums[0] == target && sums[1] == target && sums[2] == target
- }
- for i := 0; i < 4; i++ {
- if sums[i]+nums[idx] <= target {
- sums[i] += nums[idx]
- if dfs(nums, sums, n, idx+1, target) {
- return true
- }
- sums[i] -= nums[idx]
- }
- }
- return false
- }
|