2369. 检查数组是否存在有效划分 【动态规划】【C++不能连等】

45 阅读1分钟

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

每日链接

class Solution:
    def validPartition(self, nums: List[int]) -> bool:
        # nums 的前 n 个数 能否有效划分
        ## 最后两个数相等, 前 n - 2 个数能否有效划分
        ## 最后三个数 相等 或 递增 , 前 n - 3 个数 能否有效划分
        n = len(nums)
        dp = [True] + [False] * n  # 前 i 个数能否正确划分
 
        for i in range(1, n + 1):
            if i >= 2:
                dp[i] = dp[i - 2] and nums[i - 1] == nums[i - 2]
            if i >= 3:
                dp[i] = dp[i] or (dp[i - 3] and (nums[i - 3] == nums[i - 2] == nums[i - 1] or nums[i - 3] + 2 == nums[i - 2] + 1 == nums[i - 1]))

        return dp[-1]

image.png

class Solution {
public:
    bool validPartition(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n + 1, false);
        dp[0] = true; 
        for (int i = 1; i <= n; ++i){
            if (i >= 2){
                dp[i] = dp[i - 2] && nums[i - 2] == nums[i - 1];
            }
            if (i >= 3){
                dp[i] = dp[i] || (dp[i - 3] && ((nums[i - 3] == nums[i - 2] &&  nums[i - 2] == nums[i - 1]) || (nums[i - 3] + 1 == nums[i - 2] &&  nums[i - 2] + 1 == nums[i - 1])));
            }
        }
        return dp[n];
    }
};

image.png