mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
添加 problem 128
This commit is contained in:
@ -0,0 +1,97 @@
|
||||
package leetcode
|
||||
|
||||
// 解法一 map,时间复杂度 O(n)
|
||||
func longestConsecutive(nums []int) int {
|
||||
res, numMap := 0, map[int]int{}
|
||||
for _, num := range nums {
|
||||
if numMap[num] == 0 {
|
||||
left, right, sum := 0, 0, 0
|
||||
if numMap[num-1] > 0 {
|
||||
left = numMap[num-1]
|
||||
} else {
|
||||
left = 0
|
||||
}
|
||||
if numMap[num+1] > 0 {
|
||||
right = numMap[num+1]
|
||||
} else {
|
||||
right = 0
|
||||
}
|
||||
// sum: length of the sequence n is in
|
||||
sum = left + right + 1
|
||||
numMap[num] = sum
|
||||
// keep track of the max length
|
||||
res = max(res, sum)
|
||||
// extend the length to the boundary(s) of the sequence
|
||||
// will do nothing if n has no neighbors
|
||||
numMap[num-left] = sum
|
||||
numMap[num+right] = sum
|
||||
} else {
|
||||
continue
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// 解法二 并查集
|
||||
func longestConsecutive1(nums []int) int {
|
||||
if len(nums) == 0 {
|
||||
return 0
|
||||
}
|
||||
numMap, countMap, lcs, uf := map[int]int{}, map[int]int{}, 0, UnionFind{}
|
||||
uf.init(len(nums))
|
||||
for i := 0; i < len(nums); i++ {
|
||||
countMap[i] = 1
|
||||
}
|
||||
for i := 0; i < len(nums); i++ {
|
||||
if _, ok := numMap[nums[i]]; ok {
|
||||
continue
|
||||
}
|
||||
numMap[nums[i]] = i
|
||||
if _, ok := numMap[nums[i]+1]; ok {
|
||||
uf.union(i, numMap[nums[i]+1])
|
||||
}
|
||||
if _, ok := numMap[nums[i]-1]; ok {
|
||||
uf.union(i, numMap[nums[i]-1])
|
||||
}
|
||||
}
|
||||
for key := range countMap {
|
||||
parent := uf.find(key)
|
||||
if parent != key {
|
||||
countMap[parent]++
|
||||
}
|
||||
if countMap[parent] > lcs {
|
||||
lcs = countMap[parent]
|
||||
}
|
||||
}
|
||||
return lcs
|
||||
}
|
||||
|
||||
// 解法三 暴力解法,时间复杂度 O(n^2)
|
||||
func longestConsecutive2(nums []int) int {
|
||||
if len(nums) == 0 {
|
||||
return 0
|
||||
}
|
||||
numMap, length, tmp, lcs := map[int]bool{}, 0, 0, 0
|
||||
for i := 0; i < len(nums); i++ {
|
||||
numMap[nums[i]] = true
|
||||
}
|
||||
for key := range numMap {
|
||||
if !numMap[key-1] && !numMap[key+1] {
|
||||
delete(numMap, key)
|
||||
}
|
||||
}
|
||||
if len(numMap) == 0 {
|
||||
return 1
|
||||
}
|
||||
for key := range numMap {
|
||||
if !numMap[key-1] && numMap[key+1] {
|
||||
length, tmp = 1, key+1
|
||||
for numMap[tmp] {
|
||||
length++
|
||||
tmp++
|
||||
}
|
||||
lcs = max(lcs, length)
|
||||
}
|
||||
}
|
||||
return max(lcs, length)
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type question128 struct {
|
||||
para128
|
||||
ans128
|
||||
}
|
||||
|
||||
// para 是参数
|
||||
// one 代表第一个参数
|
||||
type para128 struct {
|
||||
one []int
|
||||
}
|
||||
|
||||
// ans 是答案
|
||||
// one 代表第一个答案
|
||||
type ans128 struct {
|
||||
one int
|
||||
}
|
||||
|
||||
func Test_Problem128(t *testing.T) {
|
||||
|
||||
qs := []question128{
|
||||
|
||||
question128{
|
||||
para128{[]int{}},
|
||||
ans128{0},
|
||||
},
|
||||
|
||||
question128{
|
||||
para128{[]int{0}},
|
||||
ans128{1},
|
||||
},
|
||||
|
||||
question128{
|
||||
para128{[]int{9, 1, 4, 7, 3, -1, 0, 5, 8, -1, 6}},
|
||||
ans128{7},
|
||||
},
|
||||
|
||||
question128{
|
||||
para128{[]int{2147483646, -2147483647, 0, 2, 2147483644, -2147483645, 2147483645}},
|
||||
ans128{3},
|
||||
},
|
||||
|
||||
question128{
|
||||
para128{[]int{100, 4, 200, 1, 3, 2}},
|
||||
ans128{4},
|
||||
},
|
||||
}
|
||||
|
||||
fmt.Printf("------------------------Leetcode Problem 128------------------------\n")
|
||||
|
||||
for _, q := range qs {
|
||||
_, p := q.ans128, q.para128
|
||||
fmt.Printf("【input】:%v 【output】:%v\n", p, longestConsecutive(p.one))
|
||||
}
|
||||
fmt.Printf("\n\n\n")
|
||||
}
|
Reference in New Issue
Block a user