一开始看以为考察DP。。按照题目的意思,只有一段下降,所以使用两个指针,截取出头部开始的非下降subarray和截止于尾部的非下降subarray,随后看前者的前缀保留多少,后者的后缀保留多少个,中间的部分就是需要去掉的subarray。
class Solution:
def findLengthOfShortestSubarray(self, arr: List[int]) -> int:
N = len(arr)
head_inc = 0
tail_inc = N-1
while head_inc + 1 < N and arr[head_inc+1] >= arr[head_inc]:
head_inc += 1
while tail_inc - 1 >= 0 and arr[tail_inc-1] <= arr[tail_inc]:
tail_inc -= 1
res = tail_inc#make sure to use this length as initiation, in case we have [5 4 3 2 1].
head_inc_seq = arr[:head_inc+1]
tail_inc_seq = arr[tail_inc:]
for startindex, num in enumerate(head_inc_seq):
endindex = bisect.bisect_left(tail_inc_seq, num)
res = min(tail_inc + endindex - 1 -startindex, res)
return max(res, 0) # when the arr is 12345, 0 + 0 - 0 - 1 = -1