-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path3176-FindTheMaximumLengthOfAGoodSubsequenceI.go
More file actions
124 lines (108 loc) · 3.63 KB
/
3176-FindTheMaximumLengthOfAGoodSubsequenceI.go
File metadata and controls
124 lines (108 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
// 3176. Find the Maximum Length of a Good Subsequence I
// You are given an integer array nums and a non-negative integer k.
// A sequence of integers seq is called good if there are at most k indices i in the range [0, seq.length - 2] such that seq[i] != seq[i + 1].
// Return the maximum possible length of a good subsequence of nums.
// Example 1:
// Input: nums = [1,2,1,1,3], k = 2
// Output: 4
// Explanation:
// The maximum length subsequence is [1,2,1,1,3].
// Example 2:
// Input: nums = [1,2,3,4,5,1], k = 0
// Output: 2
// Explanation:
// The maximum length subsequence is [1,2,3,4,5,1].
// Constraints:
// 1 <= nums.length <= 500
// 1 <= nums[i] <= 10^9
// 0 <= k <= min(nums.length, 25)
import "fmt"
func maximumLength(nums []int, k int) int {
min := func (x, y int) int { if x < y { return x; }; return y; }
max := func (x, y int) int { if x > y { return x; }; return y; }
res, n, mn := 1, len(nums), min(k + 1, 51)
dp := make([][]int, n)
for i := range dp {
dp[i] = make([]int, mn)
for j := range dp[i] {
dp[i][j] = 1 // fill 1
}
}
for i := 1; i < n; i++ {
for j := 0; j < min(k, 50) + 1; j++ {
for k := 0; k < i; k++ {
if nums[k] == nums[i] {
dp[i][j] = max(dp[i][j], dp[k][j] + 1)
} else if j > 0 {
dp[i][j] = max(dp[i][j], dp[k][j - 1] + 1)
}
}
res = max(res, dp[i][j])
}
}
return res
}
// class Solution:
// def maximumLength(self, nums: List[int], k: int) -> int:
// n = len(nums)
// dp = [[1] * min(k + 1, 51) for _ in range(n)]
// max_length = 1
// for i in range(1, n):
// for j in range(min(k, 50) + 1):
// for m in range(i):
// if nums[m] == nums[i]:
// dp[i][j] = max(dp[i][j], dp[m][j] + 1)
// elif j > 0:
// dp[i][j] = max(dp[i][j], dp[m][j - 1] + 1)
// max_length = max(max_length, dp[i][j])
// return max_length
func maximumLength1(nums []int, k int) int {
fs, records := map[int][]int{}, make([]struct{ mx, mx2, num int }, k+1)
max := func (x, y int) int { if x > y { return x; }; return y; }
for _, x := range nums {
if fs[x] == nil {
fs[x] = make([]int, k+1)
}
f := fs[x]
for j := k; j >= 0; j-- {
f[j]++
if j > 0 {
p := records[j-1]
m := p.mx
if x == p.num {
m = p.mx2
}
f[j] = max(f[j], m+1)
}
// records[j] 维护 fs[.][j] 的 mx,mx2,num
v := f[j]
p := &records[j]
if v > p.mx {
if x != p.num {
p.num = x
p.mx2 = p.mx
}
p.mx = v
} else if x != p.num && v > p.mx2 {
p.mx2 = v
}
}
}
return records[k].mx
}
func main() {
// Example 1:
// Input: nums = [1,2,1,1,3], k = 2
// Output: 4
// Explanation:
// The maximum length subsequence is [1,2,1,1,3].
fmt.Println(maximumLength([]int{1,2,1,1,3}, 2)) // 4
// Input: nums = [1,2,3,4,5,1], k = 0
// Output: 2
// Explanation:
// The maximum length subsequence is [1,2,3,4,5,1].
fmt.Println(maximumLength([]int{1,2,3,4,5,1}, 0)) // 2
fmt.Println(maximumLength1([]int{1,2,1,1,3}, 2)) // 4
fmt.Println(maximumLength1([]int{1,2,3,4,5,1}, 0)) // 2
}