返回介绍

solution / 2700-2799 / 2771.Longest Non-decreasing Subarray From Two Arrays / README_EN

发布于 2024-06-17 01:03:00 字数 5888 浏览 0 评论 0 收藏 0

2771. Longest Non-decreasing Subarray From Two Arrays

中文文档

Description

You are given two 0-indexed integer arrays nums1 and nums2 of length n.

Let's define another 0-indexed integer array, nums3, of length n. For each index i in the range [0, n - 1], you can assign either nums1[i] or nums2[i] to nums3[i].

Your task is to maximize the length of the longest non-decreasing subarray in nums3 by choosing its values optimally.

Return _an integer representing the length of the longest non-decreasing subarray in_ nums3.

Note: A subarray is a contiguous non-empty sequence of elements within an array.

 

Example 1:

Input: nums1 = [2,3,1], nums2 = [1,2,1]
Output: 2
Explanation: One way to construct nums3 is: 
nums3 = [nums1[0], nums2[1], nums2[2]] => [2,2,1]. 
The subarray starting from index 0 and ending at index 1, [2,2], forms a non-decreasing subarray of length 2. 
We can show that 2 is the maximum achievable length.

Example 2:

Input: nums1 = [1,3,2,1], nums2 = [2,2,3,4]
Output: 4
Explanation: One way to construct nums3 is: 
nums3 = [nums1[0], nums2[1], nums2[2], nums2[3]] => [1,2,3,4]. 
The entire array forms a non-decreasing subarray of length 4, making it the maximum achievable length.

Example 3:

Input: nums1 = [1,1], nums2 = [2,2]
Output: 2
Explanation: One way to construct nums3 is: 
nums3 = [nums1[0], nums1[1]] => [1,1]. 
The entire array forms a non-decreasing subarray of length 2, making it the maximum achievable length.

 

Constraints:

  • 1 <= nums1.length == nums2.length == n <= 105
  • 1 <= nums1[i], nums2[i] <= 109

Solutions

Solution 1

class Solution:
  def maxNonDecreasingLength(self, nums1: List[int], nums2: List[int]) -> int:
    n = len(nums1)
    f = g = 1
    ans = 1
    for i in range(1, n):
      ff = gg = 1
      if nums1[i] >= nums1[i - 1]:
        ff = max(ff, f + 1)
      if nums1[i] >= nums2[i - 1]:
        ff = max(ff, g + 1)
      if nums2[i] >= nums1[i - 1]:
        gg = max(gg, f + 1)
      if nums2[i] >= nums2[i - 1]:
        gg = max(gg, g + 1)
      f, g = ff, gg
      ans = max(ans, f, g)
    return ans
class Solution {
  public int maxNonDecreasingLength(int[] nums1, int[] nums2) {
    int n = nums1.length;
    int f = 1, g = 1;
    int ans = 1;
    for (int i = 1; i < n; ++i) {
      int ff = 1, gg = 1;
      if (nums1[i] >= nums1[i - 1]) {
        ff = Math.max(ff, f + 1);
      }
      if (nums1[i] >= nums2[i - 1]) {
        ff = Math.max(ff, g + 1);
      }
      if (nums2[i] >= nums1[i - 1]) {
        gg = Math.max(gg, f + 1);
      }
      if (nums2[i] >= nums2[i - 1]) {
        gg = Math.max(gg, g + 1);
      }
      f = ff;
      g = gg;
      ans = Math.max(ans, Math.max(f, g));
    }
    return ans;
  }
}
class Solution {
public:
  int maxNonDecreasingLength(vector<int>& nums1, vector<int>& nums2) {
    int n = nums1.size();
    int f = 1, g = 1;
    int ans = 1;
    for (int i = 1; i < n; ++i) {
      int ff = 1, gg = 1;
      if (nums1[i] >= nums1[i - 1]) {
        ff = max(ff, f + 1);
      }
      if (nums1[i] >= nums2[i - 1]) {
        ff = max(ff, g + 1);
      }
      if (nums2[i] >= nums1[i - 1]) {
        gg = max(gg, f + 1);
      }
      if (nums2[i] >= nums2[i - 1]) {
        gg = max(gg, g + 1);
      }
      f = ff;
      g = gg;
      ans = max(ans, max(f, g));
    }
    return ans;
  }
};
func maxNonDecreasingLength(nums1 []int, nums2 []int) int {
  n := len(nums1)
  f, g, ans := 1, 1, 1
  for i := 1; i < n; i++ {
    ff, gg := 1, 1
    if nums1[i] >= nums1[i-1] {
      ff = max(ff, f+1)
    }
    if nums1[i] >= nums2[i-1] {
      ff = max(ff, g+1)
    }
    if nums2[i] >= nums1[i-1] {
      gg = max(gg, f+1)
    }
    if nums2[i] >= nums2[i-1] {
      gg = max(gg, g+1)
    }
    f, g = ff, gg
    ans = max(ans, max(f, g))
  }
  return ans
}
function maxNonDecreasingLength(nums1: number[], nums2: number[]): number {
  const n = nums1.length;
  let [f, g, ans] = [1, 1, 1];
  for (let i = 1; i < n; ++i) {
    let [ff, gg] = [1, 1];
    if (nums1[i] >= nums1[i - 1]) {
      ff = Math.max(ff, f + 1);
    }
    if (nums1[i] >= nums2[i - 1]) {
      ff = Math.max(ff, g + 1);
    }
    if (nums2[i] >= nums1[i - 1]) {
      gg = Math.max(gg, f + 1);
    }
    if (nums2[i] >= nums2[i - 1]) {
      gg = Math.max(gg, g + 1);
    }
    f = ff;
    g = gg;
    ans = Math.max(ans, f, g);
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文