dengxinyi 6 tahun lalu
induk
melakukan
6abef98efd
3 mengubah file dengan 84 tambahan dan 0 penghapusan
  1. 32 0
      hard/128.go
  2. 9 0
      hard/132.go
  3. 43 0
      hard/uf.go

+ 32 - 0
hard/128.go

@@ -0,0 +1,32 @@
+package main
+
+func longestConsecutive(nums []int) (length int) {
+	n := len(nums)
+	if n <= 1 {
+		return n
+	}
+	uf := NewUF(n)
+	m := make(map[int]int)
+	for i := 0; i < n; i++ {
+		if _, ok := m[nums[i]]; !ok {
+			m[nums[i]] = i
+			if idL, okL := m[nums[i]-1]; okL {
+				uf.Union(i, idL)
+			}
+			if idR, okR := m[nums[i]+1]; okR {
+				uf.Union(i, idR)
+			}
+		}
+	}
+	for i := 0; i < n; i++ {
+		if uf.Size[i] > length {
+			length = uf.Size[i]
+		}
+	}
+	return
+}
+
+// func main() {
+// 	println(longestConsecutive([]int{100, 4, 200, 1, 3, 2}), 4)
+// 	println(longestConsecutive([]int{0, -1}), 2)
+// }

+ 9 - 0
hard/132.go

@@ -0,0 +1,9 @@
+package main
+
+func minCut(s string) int {
+	return 0
+}
+
+func main() {
+
+}

+ 43 - 0
hard/uf.go

@@ -0,0 +1,43 @@
+package main
+
+// UF ...
+type UF struct {
+	ID   []int
+	Size []int
+	Cnt  int
+}
+
+// NewUF ...
+func NewUF(size int) UF {
+	var uf UF
+	uf.ID = make([]int, size)
+	uf.Size = make([]int, size)
+	for i := 0; i < size; i++ {
+		uf.ID[i] = i
+		uf.Size[i] = 1
+	}
+	uf.Cnt = size
+	return uf
+}
+
+// Find ...
+func (uf UF) Find(id int) int {
+	if uf.ID[id] != id {
+		uf.ID[id] = uf.Find(uf.ID[id])
+	}
+	return uf.ID[id]
+}
+
+// Union ...
+func (uf UF) Union(i, j int) {
+	fi, fj := uf.Find(i), uf.Find(j)
+	if fi == fj {
+		return
+	}
+	if uf.Size[fi] < uf.Size[fj] { // Swap fi, fj
+		fi, fj = fj, fi
+	}
+	uf.ID[fj] = fi // Merge fj into fi
+	uf.Size[fi] += uf.Size[fj]
+	uf.Cnt--
+}