题目描述:
给你一个整数数组 arr ,请你删除一个子数组(可以为空),使得 arr 中剩下的元素是 非递减 的。
一个子数组指的是原数组中连续的一个子序列。
请你返回满足题目要求的最短子数组的长度。
分析:
三种情况: 保留左边 保留右边 左右两边都保留(从左边向右开始找两端满足情况的最接近的状态)
class Solution {
public:
/*
* 三种情况,左边删除一段,右边删除一段,或者从中间删除一段,比较他们三处数组的长度,找到最小的;
*/
int findLengthOfShortestSubarray(vector<int>& arr) {
int len = arr.size();
if(len == 1)
return 0;
vector<int> left;
vector<int> right;
//左边
left.push_back(arr[0]);
for(int i = 1 ; i < arr.size() ; i++)
if(arr[i]>=arr[i-1]) left.push_back(arr[i]);
else break;
int ans = arr.size() - left.size();
if(ans == 0 )
return 0;
//右边
right.push_back(arr[len-1]);
for(int i = len - 2 ; i >= 0 ; i--)
if(arr[i]<=arr[i+1]) right.push_back(arr[i]);
else break;
ans = min(len-(int)right.size(),ans);
if(ans == 0)
return 0;
//中间段
reverse(right.begin(),right.end());
int i = 0 , j = 0;
while(i<left.size()&&j<right.size())
{
if(left[i]<=right[j])
{
ans = min(ans,(int)arr.size()-(int)(right.size()-j) - (i+1));
i++;
}
else
{
j++;
}
}
return ans;
}
};
可以优化一下不用数组去存左右两边的元素;