dengxinyi 6 lat temu
rodzic
commit
df20fb26f9
1 zmienionych plików z 12 dodań i 18 usunięć
  1. 12 18
      medium/698.partition-to-k-equal-sum-subsets.go

+ 12 - 18
medium/698.partition-to-k-equal-sum-subsets.go

@@ -9,35 +9,29 @@ func canPartitionKSubsets(nums []int, k int) bool {
 		return false
 	}
 	sum /= k
-	m := make(map[[3]int]none) // Use memorized search to avoid TLE
-	return dfs(nums, k, sum, 0, 0, m)
+	sort.Sort(sort.Reverse(sort.IntSlice(nums))) // Sort the nums to avoid TLE (or use memorized search)
+	return dfs(nums, k, sum, 0, 0)
 }
 
-func dfs(nums []int, k, sum, cur, set int, m map[[3]int]none) bool {
+func dfs(nums []int, k, sum, cur, set int) bool {
 	if k == 0 {
 		return set == 1<<uint(len(nums))-1
 	}
-	if _, ok := m[[3]int{k, cur, set}]; ok {
-		return false
-	}
 	for i := range nums {
 		if set>>uint(i)&1 == 1 {
 			continue
 		}
-		if t := cur + nums[i]; sum < t {
-			continue
-		} else if t < sum {
-			nset := set | (1 << uint(i))
-			if dfs(nums, k, sum, t, nset, m) {
-				return true
-			}
-			m[[3]int{k, t, nset}] = none{}
-		} else {
-			nset := set | (1 << uint(i))
-			if dfs(nums, k-1, sum, 0, nset, m) {
+		t := cur + nums[i]
+		if sum < t {
+			break
+		}
+		nset := set | (1 << uint(i))
+		if t < sum {
+			if dfs(nums, k, sum, t, nset) {
 				return true
 			}
-			m[[3]int{k, t, nset}] = none{}
+		} else if dfs(nums, k-1, sum, 0, nset) {
+			return true
 		}
 	}
 	return false