1. 解题思路
这一题是Leetcode双周赛169的第三题,是一个medium的题目。
这一题我的思路是一个动态规划的思路,分别考察以下三个数组:
s1: 表示每一个元素作为subarray的起点时在不改变任何元素的情况下能够获取的最大子串的长度;s2: 表示每一个元素作为subarray的终点时在不改变任何元素的情况下能够获取的最大子串的长度;s3: 表示只改变当前元素的情况下能够获取的包含当前元素的最长子串的长度。
则不难发现有迭代公式:
s1[i] = nums[i] <= nums[i+1] ? s1[i+1] + 1 : 1s2[i] = nums[i-1] <= nums[i] ? s2[i-1] + 1 : 1s3[i] = nums[i-1] <= nums[i+1] ? 1 + s2[i-1] + s1[i+1] : 1 + max(s2[i-1], s1[i+1])
我们分别计算出这三个数组,然后取他们当中所有元素的最大值返回即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def longestSubarray(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return 1
s1 = [1 for _ in range(n)]
for i in range(n-2, -1, -1):
if nums[i] <= nums[i+1]:
s1[i] = s1[i+1] + 1
s2 = [1 for _ in range(n)]
for i in range(n-1):
if nums[i] <= nums[i+1]:
s2[i+1] = 1 + s2[i]
s3 = [1 for _ in range(n)]
s3[0] = s1[1] + 1
s3[-1] = s2[-2] + 1
for i in range(1, n-1):
if nums[i-1] <= nums[i+1]:
s3[i] = s2[i-1] + 1 + s1[i+1]
else:
s3[i] = max(s2[i-1], s1[i+1]) + 1
return max(max(x, y, z) for x, y, z in zip(s1, s2, s3))
提交代码评测得到:耗时615ms,占用内存37.17MB。
替换至多一元素的最长非减子数组

被折叠的 条评论
为什么被折叠?



