499、非重叠子数组最大和

63 阅读1分钟

🍗 题目列表页sourl.co/TvuX3Q

问题描述

小R遇到一个数组 nums,他需要从中找到两个非重叠的子数组,它们的长度分别为 firstLensecondLen。这两个子数组可以相互独立,顺序没有限制,但它们不能有任何重叠。你需要帮小R找出这些子数组的最大和。


测试样例

样例1:

输入:nums = [0,6,5,2,2,5,1,9,4], firstLen = 1, secondLen = 2 输出:20

样例2:

输入:nums = [3,8,1,3,5,2,1,0], firstLen = 3, secondLen = 2 输出:21

样例3:

输入:nums = [2,1,4,3,5,9,5,0,3,8], firstLen = 4, secondLen = 3 输出:33


解题思路

1、计算所有长度为 firstLen 的子数组的和。

2、计算所有长度为 secondLen 的子数组的和。

3、保证这两个子数组不重叠。

4、在每个合法的组合中计算最大和。

解题代码

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int solution(vector<int> nums, int firstLen, int secondLen) {
    int n = nums.size();
    
    // 计算长度为 firstLen 的所有子数组的和
    vector<int> firstSums(n - firstLen + 1, 0);
    for (int i = 0; i <= n - firstLen; i++) {
        for (int j = 0; j < firstLen; j++) {
            firstSums[i] += nums[i + j];
        }
    }

    // 计算长度为 secondLen 的所有子数组的和
    vector<int> secondSums(n - secondLen + 1, 0);
    for (int i = 0; i <= n - secondLen; i++) {
        for (int j = 0; j < secondLen; j++) {
            secondSums[i] += nums[i + j];
        }
    }

    // 找到最大和
    int maxSum = 0;
    for (int i = 0; i <= n - firstLen; i++) {
        for (int j = 0; j <= n - secondLen; j++) {
            // 确保两个子数组不重叠
            if (i + firstLen <= j || j + secondLen <= i) {
                maxSum = max(maxSum, firstSums[i] + secondSums[j]);
            }
        }
    }
    
    return maxSum;
}

int main() {
    cout << (solution({0, 6, 5, 2, 2, 5, 1, 9, 4}, 1, 2) == 20) << endl;
    cout << (solution({3, 8, 1, 3, 5, 2, 1, 0}, 3, 2) == 21) << endl;
    cout << (solution({2, 1, 4, 3, 5, 9, 5, 0, 3, 8}, 4, 3) == 33) << endl;
    return 0;
}