1. 解题思路
这道题需要注意的是,题目要求只能删除一个连续子串,使得剩余的元素变成一个递增序列。
因此,保留的部分必然是前面一段,后面一段(前后可以为空),删去中间的部分,然后前后保留的部分必然是各自都得是单调增的。
因此,我们只需要先找出后方的最长单调增序列,然后从前方找出单调增序列,然后依次考察以每一个元素作为前部分的终点时,后方可选的起点位置即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def incremovableSubarrayCount(self, nums: List[int]) -> int:
n = len(nums)
post = nums[-1] + 1
j = n-1
while j >= 0:
if nums[j] < post:
post = nums[j]
j -= 1
else:
break
if j == -1:
return n * (n+1) // 2
m = j+1
ans = n-j
pre = nums[0]-1
j = j+1
for i in range(m):
if nums[i] <= pre:
break
while j < n and nums[j] <= nums[i]:
j += 1
ans += n-j+1
pre = nums[i]
return ans
提交代码评测得到:耗时620ms,占用内存31MB。