mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-07 01:44:56 +08:00
添加 problem 721
This commit is contained in:
88
Algorithms/0721. Accounts Merge/721. Accounts Merge.go
Normal file
88
Algorithms/0721. Accounts Merge/721. Accounts Merge.go
Normal file
@ -0,0 +1,88 @@
|
||||
package leetcode
|
||||
|
||||
import "sort"
|
||||
|
||||
// 解法一 并查集优化搜索解法
|
||||
func accountsMerge(accounts [][]string) (r [][]string) {
|
||||
uf := UnionFind{}
|
||||
uf.init(len(accounts))
|
||||
// emailToID 将所有的 email 邮箱都拆开,拆开与 id(数组下标) 对应
|
||||
// idToName 将 id(数组下标) 与 name 对应
|
||||
// idToEmails 将 id(数组下标) 与整理好去重以后的 email 组对应
|
||||
emailToID, idToName, idToEmails, res := make(map[string]int), make(map[int]string), make(map[int][]string), [][]string{}
|
||||
for id, acc := range accounts {
|
||||
idToName[id] = acc[0]
|
||||
for i := 1; i < len(acc); i++ {
|
||||
pid, ok := emailToID[acc[i]]
|
||||
if ok {
|
||||
uf.union(id, pid)
|
||||
}
|
||||
emailToID[acc[i]] = id
|
||||
}
|
||||
}
|
||||
for email, id := range emailToID {
|
||||
pid := uf.find(id)
|
||||
idToEmails[pid] = append(idToEmails[pid], email)
|
||||
}
|
||||
for id, emails := range idToEmails {
|
||||
name := idToName[id]
|
||||
sort.Strings(emails)
|
||||
res = append(res, append([]string{name}, emails...))
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// 解法二 并查集暴力解法
|
||||
func accountsMerge1(accounts [][]string) [][]string {
|
||||
if len(accounts) == 0 {
|
||||
return [][]string{}
|
||||
}
|
||||
uf, res, visited := UnionFind{}, [][]string{}, map[int]bool{}
|
||||
uf.init(len(accounts))
|
||||
for i := 0; i < len(accounts); i++ {
|
||||
for j := i + 1; j < len(accounts); j++ {
|
||||
if accounts[i][0] == accounts[j][0] {
|
||||
tmpA, tmpB, flag := accounts[i][1:], accounts[j][1:], false
|
||||
for j := 0; j < len(tmpA); j++ {
|
||||
for k := 0; k < len(tmpB); k++ {
|
||||
if tmpA[j] == tmpB[k] {
|
||||
flag = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if flag {
|
||||
break
|
||||
}
|
||||
}
|
||||
if flag {
|
||||
uf.union(i, j)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for i := 0; i < len(accounts); i++ {
|
||||
if visited[i] {
|
||||
continue
|
||||
}
|
||||
emails, account, tmpMap := accounts[i][1:], []string{accounts[i][0]}, map[string]string{}
|
||||
for j := i + 1; j < len(accounts); j++ {
|
||||
if uf.find(j) == uf.find(i) {
|
||||
visited[j] = true
|
||||
for _, v := range accounts[j][1:] {
|
||||
tmpMap[v] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, v := range emails {
|
||||
tmpMap[v] = v
|
||||
}
|
||||
emails = []string{}
|
||||
for key := range tmpMap {
|
||||
emails = append(emails, key)
|
||||
}
|
||||
sort.Strings(emails)
|
||||
account = append(account, emails...)
|
||||
res = append(res, account)
|
||||
}
|
||||
return res
|
||||
}
|
73
Algorithms/0721. Accounts Merge/721. Accounts Merge_test.go
Normal file
73
Algorithms/0721. Accounts Merge/721. Accounts Merge_test.go
Normal file
@ -0,0 +1,73 @@
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type question721 struct {
|
||||
para721
|
||||
ans721
|
||||
}
|
||||
|
||||
// para 是参数
|
||||
// one 代表第一个参数
|
||||
type para721 struct {
|
||||
w [][]string
|
||||
}
|
||||
|
||||
// ans 是答案
|
||||
// one 代表第一个答案
|
||||
type ans721 struct {
|
||||
one [][]string
|
||||
}
|
||||
|
||||
func Test_Problem721(t *testing.T) {
|
||||
|
||||
qs := []question721{
|
||||
|
||||
question721{
|
||||
para721{[][]string{[]string{"John", "johnsmith@mail.com", "john00@mail.com"},
|
||||
[]string{"John", "johnnybravo@mail.com"},
|
||||
[]string{"John", "johnsmith@mail.com", "john_newyork@mail.com"},
|
||||
[]string{"Mary", "mary@mail.com"}}},
|
||||
ans721{[][]string{[]string{"John", "john00@mail.com", "john_newyork@mail.com", "johnsmith@mail.com"},
|
||||
[]string{"John", "johnnybravo@mail.com"},
|
||||
[]string{"Mary", "mary@mail.com"}}},
|
||||
},
|
||||
|
||||
question721{
|
||||
para721{[][]string{[]string{"Alex", "Alex5@m.co", "Alex4@m.co", "Alex0@m.co"},
|
||||
[]string{"Ethan", "Ethan3@m.co", "Ethan3@m.co", "Ethan0@m.co"},
|
||||
[]string{"Kevin", "Kevin4@m.co", "Kevin2@m.co", "Kevin2@m.co"},
|
||||
[]string{"Gabe", "Gabe0@m.co", "Gabe3@m.co", "Gabe2@m.co"},
|
||||
[]string{"Gabe", "Gabe3@m.co", "Gabe4@m.co", "Gabe2@m.co"}}},
|
||||
ans721{[][]string{[]string{"Alex", "Alex0@m.co", "Alex4@m.co", "Alex5@m.co"},
|
||||
[]string{"Ethan", "Ethan0@m.co", "Ethan3@m.co"},
|
||||
[]string{"Gabe", "Gabe0@m.co", "Gabe2@m.co", "Gabe3@m.co", "Gabe4@m.co"},
|
||||
[]string{"Kevin", "Kevin2@m.co", "Kevin4@m.co"}}},
|
||||
},
|
||||
|
||||
question721{
|
||||
para721{[][]string{[]string{"David", "David0@m.co", "David4@m.co", "David3@m.co"},
|
||||
[]string{"David", "David5@m.co", "David5@m.co", "David0@m.co"},
|
||||
[]string{"David", "David1@m.co", "David4@m.co", "David0@m.co"},
|
||||
[]string{"David", "David0@m.co", "David1@m.co", "David3@m.co"},
|
||||
[]string{"David", "David4@m.co", "David1@m.co", "David3@m.co"}}},
|
||||
ans721{[][]string{[]string{"David", "David0@m.co", "David1@m.co", "David3@m.co", "David4@m.co", "David5@m.co"}}},
|
||||
},
|
||||
|
||||
question721{
|
||||
para721{[][]string{}},
|
||||
ans721{[][]string{}},
|
||||
},
|
||||
}
|
||||
|
||||
fmt.Printf("------------------------Leetcode Problem 721------------------------\n")
|
||||
|
||||
for _, q := range qs {
|
||||
_, p := q.ans721, q.para721
|
||||
fmt.Printf("【input】:%v 【output】:%v\n", p, accountsMerge(p.w))
|
||||
}
|
||||
fmt.Printf("\n\n\n")
|
||||
}
|
Reference in New Issue
Block a user