解法

假设每个位置为最后合成数组的最长子数组的开头。 因此,枚举每个位置的最长子数组 第一个位置肯定取最小值,之后7月9日周赛 3.构造最长非递减子数组_子数组的数值,如果7月9日周赛 3.构造最长非递减子数组_leetcode_027月9日周赛 3.构造最长非递减子数组_周赛_03都大于等于先前的数字7月9日周赛 3.构造最长非递减子数组_leetcode_04,那么就取7月9日周赛 3.构造最长非递减子数组_周赛_05,如果都小于,那么直接7月9日周赛 3.构造最长非递减子数组_leetcode_06。否则就说明7月9日周赛 3.构造最长非递减子数组_leetcode_04的数值在7月9日周赛 3.构造最长非递减子数组_leetcode_027月9日周赛 3.构造最长非递减子数组_周赛_03的中间,因此,取大于7月9日周赛 3.构造最长非递减子数组_leetcode_04的数值。 剪枝

  1. 如果剩下的数组元素个数要小于当前的最大长度7月9日周赛 3.构造最长非递减子数组_周赛_11,直接7月9日周赛 3.构造最长非递减子数组_leetcode_06
  2. 如果第7月9日周赛 3.构造最长非递减子数组_子数组位的元素都大于第7月9日周赛 3.构造最长非递减子数组_子数组_14位元素的最小值,那么说明前面的最大子数组长度包括以当前开头的子数组长度,可以跳过。

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