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

61 阅读1分钟

题目:
给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。

如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分:

  1. 子数组  由 2 个相等元素组成,例如,子数组 [2,2] 。
  2. 子数组  由 3 个相等元素组成,例如,子数组 [4,4,4] 。
  3. 子数组  由 3 个连续递增元素组成,并且相邻元素之间的差值为 1 。例如,子数组 [3,4,5] ,但是子数组 [1,3,5] 不符合要求。

如果数组 至少 存在一种有效划分,返回 true **,否则,返回 false 。

算法:
方法一:动态规划
问能不能划分,状态dp[i]表示以i为最后一个元素,能否划分。

func validPartition(nums []int) bool {
    n := len(nums)
    if n == 1 {
        return false
    }
    dp := make([]bool, n)
    if nums[1] == nums[0] {
        dp[1] = true
    }
    for i := 2; i < n; i ++ {
        if nums[i] == nums[i - 1] && dp[i - 2]{
            dp[i] = true
        }
        // 注意i == 2的时候dp[i - 3]不存在
        if nums[i] == nums[i - 1] && nums[i - 1] == nums[i - 2] && (i == 2 || dp[i - 3]) {
            dp[i] = true
        }
         // 注意i == 2的时候dp[i - 3]不存在
        if  nums[i] == nums[i - 1] + 1 && nums[i - 1] == nums[i - 2] + 1 && (i == 2 || dp[i - 3]){
            dp[i] = true
        }
    }

    return dp[n - 1]
}