comments | difficulty | edit_url | rating | source | tags | ||
---|---|---|---|---|---|---|---|
true |
中等 |
1791 |
第 353 场周赛 Q3 |
|
给你两个下标从 0 开始的整数数组 nums1
和 nums2
,长度均为 n
。
让我们定义另一个下标从 0 开始、长度为 n
的整数数组,nums3
。对于范围 [0, n - 1]
的每个下标 i
,你可以将 nums1[i]
或 nums2[i]
的值赋给 nums3[i]
。
你的任务是使用最优策略为 nums3
赋值,以最大化 nums3
中 最长非递减子数组 的长度。
以整数形式表示并返回 nums3
中 最长非递减 子数组的长度。
注意:子数组 是数组中的一个连续非空元素序列。
示例 1:
输入:nums1 = [2,3,1], nums2 = [1,2,1] 输出:2 解释:构造 nums3 的方法之一是: nums3 = [nums1[0], nums2[1], nums2[2]] => [2,2,1] 从下标 0 开始到下标 1 结束,形成了一个长度为 2 的非递减子数组 [2,2] 。 可以证明 2 是可达到的最大长度。
示例 2:
输入:nums1 = [1,3,2,1], nums2 = [2,2,3,4] 输出:4 解释:构造 nums3 的方法之一是: nums3 = [nums1[0], nums2[1], nums2[2], nums2[3]] => [1,2,3,4] 整个数组形成了一个长度为 4 的非递减子数组,并且是可达到的最大长度。
示例 3:
输入:nums1 = [1,1], nums2 = [2,2] 输出:2 解释:构造 nums3 的方法之一是: nums3 = [nums1[0], nums1[1]] => [1,1] 整个数组形成了一个长度为 2 的非递减子数组,并且是可达到的最大长度。
提示:
1 <= nums1.length == nums2.length == n <= 105
1 <= nums1[i], nums2[i] <= 109
我们定义两个变量
接下来,我们在
我们可以通过
- 如果
$nums1[i] \ge nums1[i - 1]$ ,那么$ff = \max(ff, f + 1)$ ; - 如果
$nums1[i] \ge nums2[i - 1]$ ,那么$ff = \max(ff, g + 1)$ ; - 如果
$nums2[i] \ge nums1[i - 1]$ ,那么$gg = \max(gg, f + 1)$ ; - 如果
$nums2[i] \ge nums2[i - 1]$ ,那么$gg = \max(gg, g + 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;
}