解法
假设每个位置为最后合成数组的最长子数组的开头。 因此,枚举每个位置的最长子数组 第一个位置肯定取最小值,之后第位的数值,如果和都大于等于先前的数字,那么就取,如果都小于,那么直接。否则就说明的数值在和的中间,因此,取大于的数值。 剪枝:
- 如果剩下的数组元素个数要小于当前的最大长度,直接;
- 如果第位的元素都大于第位元素的最小值,那么说明前面的最大子数组长度包括以当前开头的子数组长度,可以跳过。
Code
class Solution:
def maxNonDecreasingLength(self, nums1: List[int], nums2: List[int]) -> int:
# 假设每个位置的数字为最长子数组的开头
ans = 0
n = len(nums1)
for i in range(n):
pre = -1
cur_len = 0
if ans >= n - i:
break
if i > 0 and min(nums1[i], nums2[i]) > min(nums1[i - 1], nums2[i - 1]):
continue
for j in range(i, n):
if min(nums1[j],nums2[j]) >= pre:
pre = min(nums1[j], nums2[j])
cur_len += 1
elif max(nums1[j], nums2[j]) < pre:
break
else:
pre = max(nums1[j], nums2[j])
cur_len += 1
ans = max(ans, cur_len)
return ans