LeetCode 双周赛 40 D : 5559. 得到山形数组的最少删除次数
概述: 最少的删除操作次数, 使数组变成山形数组.
思路:
正着一次最长升序子序列的 dp 解法 (升序到 i)
反着一次最长升序子序列的 dp 解法 ( i 之后的降序)
最后求 两个升序序列的最长子序列个数之和 (即为删除后山形数组的长度) a r r L e n arrLen arrLen
结果 = 当前长度 - 删除后山形数组的长度 a r r L e n arrLen arrLen = 需要删除的长度
AC Code
import static java.lang.Math.*;
class Solution {
public int minimumMountainRemovals(int[] nums) {
int ans = Integer.MAX_VALUE;
int len = nums.length;
int[] f = new int[len], g = new int[len];
Arrays.fill(f, 1);
Arrays.fill(g, 1);
for (int i = 0; i < len; i++) {
for(int j = 0; j < i; j++){
if(nums[i] > nums[j])
f[i] = max(f[i], f[j] + 1);
}
}
for (int i = len - 1; i >= 0; i--) {
for (int j = len - 1; j > i; j--) {
if(nums[i] > nums[j])
g[i] = max(g[i], g[j] + 1);
}
}
System.out.println(Arrays.toString(f));
System.out.println(Arrays.toString(g));
for (int i = 0; i < len; i++) {
// 避免单调
if(f[i] > 1 && g[i] > 1)
// 两边的最长子序列相加
ans = min(ans, len - (f[i] + g[i] - 1));
}
return ans;
}
}
理解:
if(f[i] > 0 &&g[i] > 0)
>> 避免单调
山形数组要求不能单调增或单调减