给你一个下标从 0 开始的整数数组 nums
,你必须将数组划分为一个或多个 连续 子数组。
如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分:
- 子数组 恰 由
2
个相等元素组成,例如,子数组[2,2]
。 - 子数组 恰 由
3
个相等元素组成,例如,子数组[4,4,4]
。 - 子数组 恰 由
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 解释:该数组不存在有效划分。
提示:
2 <= nums.length <= 105
1 <= nums[i] <= 106
问题简要描述:判断数组是否存在有效划分
细节阐述:
- f[i] 表示数组的前 i 个元素是否存在一种有效划分
Java
class Solution {
public boolean validPartition(int[] nums) {
int n = nums.length;
boolean[] f = new boolean[n + 1];
f[0] = true;
for (int i = 1; i <= n; i++) {
boolean x = i >= 2 && nums[i - 1] == nums[i - 2];
boolean y = i >= 3 && nums[i - 1] == nums[i - 2] && nums[i - 2] == nums[i - 3];
boolean z = i >= 3 && nums[i - 1] - nums[i - 2] == 1 && nums[i - 2] - nums[i - 3] == 1;
f[i] = (x && f[i - 2]) || ((y || z) && f[i - 3]);
}
return f[n];
}
}
Python3
class Solution:
def validPartition(self, nums: List[int]) -> bool:
n = len(nums)
f = [True] + [False] * n
for i, v in enumerate(nums, 1):
x = i >= 2 and v == nums[i - 2]
y = i >= 3 and v == nums[i - 2] == nums[i - 3]
z = i >= 3 and v - nums[i - 2] == 1 and nums[i - 2] - nums[i - 3] == 1
f[i] = (x and f[i - 2]) or ((y or z) and f[i - 3])
return f[n]
TypeScript
function validPartition(nums: number[]): boolean {
const n = nums.length;
let f = Array(n + 1).fill(false);
f[0] = true;
for (let i = 1; i <= nums.length; i++) {
let x = i >= 2 && nums[i - 1] == nums[i - 2];
let y = i >= 3 && nums[i - 1] == nums[i - 2] && nums[i - 2] == nums[i - 3];
let z = i >= 3 && nums[i - 1] - nums[i - 2] == 1 && nums[i - 2] - nums[i - 3] == 1;
f[i] = (x && f[i - 2]) || ((y || z) && f[i - 3]);
}
return f[n];
};