解法
假设每个位置为最后合成数组的最长子数组的开头。
因此,枚举每个位置的最长子数组
第一个位置肯定取最小值,之后第
i
i
i位的数值,如果
n
u
m
s
1
[
i
]
nums1[i]
nums1[i]和
n
u
m
s
2
[
i
]
nums2[i]
nums2[i]都大于等于先前的数字
p
r
e
pre
pre,那么就取
m
i
n
(
n
u
m
s
1
[
i
]
,
n
u
m
s
2
[
i
]
)
min(nums1[i], nums2[i])
min(nums1[i],nums2[i]),如果都小于,那么直接
b
r
e
a
k
break
break。否则就说明
p
r
e
pre
pre的数值在
n
u
m
s
1
[
i
]
nums1[i]
nums1[i]和
n
u
m
s
2
[
i
]
nums2[i]
nums2[i]的中间,因此,取大于
p
r
e
pre
pre的数值。
剪枝:
- 如果剩下的数组元素个数要小于当前的最大长度 a n s ans ans,直接 b r e a k break break;
- 如果第 i i i位的元素都大于第 i − 1 i-1 i−1位元素的最小值,那么说明前面的最大子数组长度包括以当前开头的子数组长度,可以跳过。
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