列表

详情


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

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

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

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

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

 

示例 1:

输入:nums = [4,4,4,5,6]
输出:true
解释:数组可以划分成子数组 [4,4] 和 [4,5,6] 。
这是一种有效划分,所以返回 true 。

示例 2:

输入:nums = [1,1,1,2]
输出:false
解释:该数组不存在有效划分。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool validPartition(vector<int>& nums) { } };

php 解法, 执行用时: 267 ms, 内存消耗: 27.6 MB, 提交时间: 2024-03-01 10:49:52

class Solution {

    /**
     * @param Integer[] $nums
     * @return Boolean
     */
    function validPartition($nums) {
        $n = count($nums);
        $f = array_fill(0, $n+1, false);
        $f[0] = true;
        foreach ( $nums as $i => $x ) {
            if ( $i > 0 && $f[$i-1] && $x == $nums[$i-1] ||
                $i > 1 && $f[$i-2] && ($x == $nums[$i-1] && $x == $nums[$i-2] ||
                                    $x == $nums[$i-1]+1 && $x == $nums[$i-2]+2) ) {
                $f[$i+1] = true;
            }
        }
        return $f[$n];
    }
}

golang 解法, 执行用时: 96 ms, 内存消耗: 9.5 MB, 提交时间: 2023-09-05 07:46:40

func validPartition(nums []int) bool {
	n := len(nums)
	f := make([]bool, n+1)
	f[0] = true
	for i, x := range nums {
		if i > 0 && f[i-1] && x == nums[i-1] ||
			i > 1 && f[i-2] && (x == nums[i-1] && x == nums[i-2] ||
				                x == nums[i-1]+1 && x == nums[i-2]+2) {
			f[i+1] = true
		}
	}
	return f[n]
}

cpp 解法, 执行用时: 124 ms, 内存消耗: 81.9 MB, 提交时间: 2023-09-05 07:46:26

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

java 解法, 执行用时: 3 ms, 内存消耗: 55.2 MB, 提交时间: 2023-09-05 07:46:12

class Solution {
    public boolean validPartition(int[] nums) {
        var n = nums.length;
        var f = new boolean[n + 1];
        f[0] = true;
        for (var i = 1; i < n; ++i)
            if (f[i - 1] && nums[i] == nums[i - 1] ||
                i > 1 && f[i - 2] && (nums[i] == nums[i - 1] && nums[i] == nums[i - 2] ||
                                      nums[i] == nums[i - 1] + 1 && nums[i] == nums[i - 2] + 2))
                f[i + 1] = true;
        return f[n];
    }
}

python3 解法, 执行用时: 196 ms, 内存消耗: 31.7 MB, 提交时间: 2023-09-05 07:45:57

class Solution:
    def validPartition(self, nums: List[int]) -> bool:
        n = len(nums)
        f = [True] + [False] * n
        for i, x in enumerate(nums):
            if i > 0 and f[i - 1] and x == nums[i - 1] or \
               i > 1 and f[i - 2] and (x == nums[i - 1] == nums[i - 2] or
                                       x == nums[i - 1] + 1 == nums[i - 2] + 2):
               f[i + 1] = True
        return f[n]

上一题