funcmaxNonDecreasingLength(nums1, nums2 []int)int { ans, n := 1, len(nums1) nums := [2][]int{nums1, nums2} f := make([][2]int, n) f[0] = [2]int{1, 1} for i := 1; i < n; i++ { f[i] = [2]int{1, 1} for j := 0; j < 2; j++ { if nums1[i-1] <= nums[j][i] { f[i][j] = f[i-1][0] + 1 } if nums2[i-1] <= nums[j][i] { f[i][j] = max(f[i][j], f[i-1][1]+1) } } ans = max(ans, max(f[i][0], f[i][1])) } return ans }
funcmax(a, b int)int { if b > a { return b }; return a }
由于 f[i] 只用到 f[i-1],所以可以去掉第一个维度。
[sol-Python3]
1 2 3 4 5 6 7 8 9 10 11 12
classSolution: defmaxNonDecreasingLength(self, nums1: List[int], nums2: List[int]) -> int: ans = f0 = f1 = 1 for (x0, y0), (x1, y1) in pairwise(zip(nums1, nums2)): f = g = 1 if x0 <= x1: f = f0 + 1 if y0 <= x1: f = max(f, f1 + 1) if x0 <= y1: g = f0 + 1 if y0 <= y1: g = max(g, f1 + 1) f0, f1 = f, g ans = max(ans, f0, f1) return ans
funcmaxNonDecreasingLength(nums1, nums2 []int)int { ans, n := 1, len(nums1) f0, f1 := 1, 1 for i := 1; i < n; i++ { f, g := 1, 1 if nums1[i-1] <= nums1[i] { f = f0 + 1 } if nums2[i-1] <= nums1[i] { f = max(f, f1+1) } if nums1[i-1] <= nums2[i] { g = f0 + 1 } if nums2[i-1] <= nums2[i] { g = max(g, f1+1) } f0, f1 = f, g ans = max(ans, max(f0, f1)) } return ans }
funcmax(a, b int)int { if b > a { return b }; return a }