🍗 题目列表页:sourl.co/TvuX3Q
问题描述
小R遇到一个数组 nums,他需要从中找到两个非重叠的子数组,它们的长度分别为 firstLen 和 secondLen。这两个子数组可以相互独立,顺序没有限制,但它们不能有任何重叠。你需要帮小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;
}