📅  最后修改于: 2023-12-03 15:26:24.849000             🧑  作者: Mango
增加/减少的子阵列是指一个长度至少为2的子数组,其元素的差值都是严格递增或严格递减的。
考虑动态规划的思想,我们可以使用两个数组 inc
和 dec
来记录以当前元素结尾的最大增加/减少子阵列的乘积。对于数组中的每个元素 nums[i]
,我们可以比较其与前一个元素的大小:
nums[i] > nums[i-1]
,则 nums[i]
可以加入到以 nums[i-1]
结尾的严格递增的子阵列中,因此 inc[i] = max(inc[i-1]*nums[i], nums[i])
,同时 dec[i] = dec[i-1]*nums[i]
;nums[i] < nums[i-1]
,则 nums[i]
可以加入到以 nums[i-1]
结尾的严格递减的子阵列中,因此 dec[i] = max(dec[i-1]*nums[i], nums[i])
,同时 inc[i] = inc[i-1]*nums[i]
;nums[i] == nums[i-1]
,则 inc[i] = inc[i-1]
且 dec[i] = dec[i-1]
。最后,答案即为 max(inc)
和 max(dec)
。
下面是一个Python实现:
def maxProduct(nums):
inc = [nums[0]]
dec = [nums[0]]
res = nums[0]
for i in range(1, len(nums)):
if nums[i] > nums[i-1]:
inc.append(max(inc[i-1]*nums[i], nums[i]))
dec.append(dec[i-1]*nums[i])
elif nums[i] < nums[i-1]:
dec.append(max(dec[i-1]*nums[i], nums[i]))
inc.append(inc[i-1]*nums[i])
else:
inc.append(inc[i-1])
dec.append(dec[i-1])
res = max(res, inc[i], dec[i])
return res
以上代码的时间复杂度为 $O(n)$,空间复杂度为 $O(n)$,其中 $n$ 是数组的长度。
注意:以上代码的实现针对的是非空数组。若输入的 nums
为空,则需要根据题目要求返回0或者-∞。