2369. 检查数组是否存在有效划分

检查数组是否存在有效划分

解法一: 动态规划

go
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
func validPartition(nums []int) bool {
n := len(nums)
dp := make([]bool, n)
// 初始化 dp 的前三个状态
dp[0] = false
dp[1] = nums[0] == nums[1]
if n == 2 {
return dp[1]
}
dp[2] = dp[1] && nums[1] == nums[2] || nums[0] == nums[1]-1 && nums[0] == nums[2]-2
// 从第四个元素元素开始递推
for i := 3; i < n; i++ {
if dp[i-2] && nums[i] == nums[i-1] {
// 1. 两个元素相等
dp[i] = true
} else if dp[i-3] && nums[i] == nums[i-1] && nums[i] == nums[i-2] {
// 2. 三个元素相同
dp[i] = true
} else if dp[i-3] && nums[i] == nums[i-1]+1 && nums[i] == nums[i-2]+2 {
// 3. 三个元素递增
dp[i] = true
}
}
// 返回最后一个元素状态是否可达
return dp[n-1]
}
作者

wuhunyu

发布于

2024-03-01

更新于

2025-01-15

许可协议