1671. 得到山形数组的最少删除次数
我们定义 arr 是 山形数组 当且仅当它满足:
给你整数数组 nums? ,请你返回将 nums 变成 山形状数组 的? 最少 删除次数。
示例 1:
示例 2:
提示:
class Solution {
public:
int minimumMountainRemovals(vector<int>& nums) {
int n = nums.size();
vector<int> pre = getLISArray(nums);
vector<int> suf = getLISArray({nums.rbegin(), nums.rend()});
reverse(suf.begin(), suf.end());
int ans = 0;
for (int i = 0; i < n; ++i) {
if (pre[i] > 1 && suf[i] > 1) {
ans = max(ans, pre[i] + suf[i] - 1);
}
}
return n - ans;
}
vector<int> getLISArray(const vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 1);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
return dp;
}
};
(1) 类似于最长递增子序列。