dengxinyi 6 سال پیش
والد
کامیت
d627b13a6e
2فایلهای تغییر یافته به همراه96 افزوده شده و 0 حذف شده
  1. 43 0
      hard/679.24-game.go
  2. 53 0
      hard/685.redundant-connection-ii.go

+ 43 - 0
hard/679.24-game.go

@@ -0,0 +1,43 @@
+const eps = 0.000001
+
+func judgePoint24(nums []int) bool {
+	list := make([]float64, len(nums))
+	for i := range nums {
+		list[i] = float64(nums[i])
+	}
+	return dfs(list)
+}
+
+func dfs(nums []float64) bool {
+	l := len(nums)
+	if l == 1 && math.Abs(nums[0]-24.0) <= eps {
+		return true
+	}
+	for i := 0; i < l-1; i++ {
+		for j := i + 1; j < l; j++ {
+			next := make([]float64, l-2)
+			for k, idx := 0, 0; k < l; k++ {
+				if k == i || k == j {
+					continue
+				}
+				next[idx], idx = nums[k], idx+1
+			}
+			p, q := nums[i], nums[j]
+			tmp := []float64{p + q, p - q, q - p, p * q}
+			if eps <= q {
+				tmp = append(tmp, p/q)
+			}
+			if eps <= p {
+				tmp = append(tmp, q/p)
+			}
+			for _, t := range tmp {
+				next = append(next, t)
+				if dfs(next) {
+					return true
+				}
+				next = next[:len(next)-1]
+			}
+		}
+	}
+	return false
+}

+ 53 - 0
hard/685.redundant-connection-ii.go

@@ -0,0 +1,53 @@
+func findRedundantDirectedConnection(edges [][]int) []int {
+	n := len(edges)
+	parent := make([]int, n+1)
+	rank := make([]int, n+1)
+	var e1, e2 []int
+	for _, edge := range edges {
+		beg, end := edge[0], edge[1]
+		if parent[end] != 0 { // Has two parents, one of it is invalid.
+			e1 = []int{parent[end], end}
+			e2 = []int{beg, end}
+			edge[0], edge[1] = 0, 0 // Delete the later edge.
+		}
+		parent[end] = beg
+	}
+	parent = make([]int, n+1) // Clear parent for UF.
+	for _, edge := range edges {
+		beg, end := edge[0], edge[1]
+		if beg == 0 || end == 0 {
+			continue
+		}
+		if parent[beg] == 0 {
+			parent[beg] = beg
+		}
+		if parent[end] == 0 {
+			parent[end] = end
+		}
+		i1, i2 := find(parent, beg), find(parent, end)
+		if i1 == i2 { // Find loop, e1 or edge is the last of the loop.
+			if len(e1) == 0 {
+				return edge
+			}
+			return e1
+		}
+		if rank[i1] < rank[i2] {
+			parent[i1] = i2
+		} else {
+			parent[i2] = i1
+			if rank[i1] == rank[i2] {
+				rank[i1]++
+			}
+		}
+	}
+	return e2 // Loop not found (after delete e2), so return e2.
+}
+
+func find(parent []int, id int) int {
+	if parent[id] == id {
+		return id
+	}
+	r := find(parent, parent[id])
+	parent[id] = r
+	return r
+}