Problem
You are given a 0-indexed integer array nums
. You have to partition the array into one or more contiguous subarrays.
We call a partition of the array valid if each of the obtained subarrays satisfies one of the following conditions:
The subarray consists of exactly
2
equal elements. For example, the subarray[2,2]
is good.The subarray consists of exactly
3
equal elements. For example, the subarray[4,4,4]
is good.The subarray consists of exactly
3
consecutive increasing elements, that is, the difference between adjacent elements is1
. For example, the subarray[3,4,5]
is good, but the subarray[1,3,5]
is not.
Return true
** if the array has at least one valid partition**. Otherwise, return false
.
Example 1:
Input: nums = [4,4,4,5,6]
Output: true
Explanation: The array can be partitioned into the subarrays [4,4] and [4,5,6].
This partition is valid, so we return true.
Example 2:
Input: nums = [1,1,1,2]
Output: false
Explanation: There is no valid partition for this array.
Constraints:
2 <= nums.length <= 10^5
1 <= nums[i] <= 10^6
Solution (Java)
class Solution {
public boolean validPartition(int[] nums) {
boolean[] canPartition = new boolean[nums.length + 1];
canPartition[0] = true;
int diff = nums[1] - nums[0];
boolean equal = diff == 0;
boolean incOne = diff == 1;
canPartition[2] = equal;
for (int i = 3; i < canPartition.length; i++) {
diff = nums[i - 1] - nums[i - 2];
if (diff == 0) {
canPartition[i] = canPartition[i - 2] || (equal && canPartition[i - 3]);
equal = true;
incOne = false;
} else if (diff == 1) {
canPartition[i] = incOne && canPartition[i - 3];
equal = false;
incOne = true;
}
}
return canPartition[nums.length];
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).