给你一个下标从 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 <= 10^51 <= nums[i] <= 10^6
感觉子串的题很多都是滑动窗口?
这一二条有重合的部分,想象如果满足二必定满足一,所以只需要判断一是否满足,如果是,则直接跳出;不满足一也不可能满足二,直接不用判断条件二了;一判断结束,开始判断三。
没试出来,直奔题解,哦,dp
-
- 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++){
- 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];
- }
- }