给你一个整数数组 arr ,请你删除一个子数组(可以为空),使得 arr 中剩下的元素是 非递减 的。
一个子数组指的是原数组中连续的一个子序列。
请你返回满足题目要求的最短子数组的长度。
思路在代码中
from typing import List
class Solution:
#分三种情况,舍去的子区间在开头,中间,结尾
def findLengthOfShortestSubarray(self, arr: List[int]) -> int:
len_arr=len(arr)
st=0
ed=len_arr-1
mi = 1e9
for i in range(1,len(arr)):
if arr[i]>=arr[i-1]:
st=i
else :
break
mi=min(mi,len_arr-st-1)#舍去的子区间在结尾
if st==len_arr-1:
return 0
for i in range(len_arr-2,-1,-1):
if arr[i]<=arr[i+1]:
ed=i
else :
break
mi=min(mi,ed)#舍去的子区间在开头
for i in range(st+1):
l=ed
r=len_arr-1
while(l<=r):
m=int((l+r)/2)
if arr[m]>=arr[i]:
mi = min(mi, m - i - 1) # 舍去的子区间以i为开头,m+1为结尾
r=m-1
else :
l=m+1
return mi