689。 3 个不重叠子数组的最大和
难度:难
主题:数组,动态规划
给定一个整数数组 nums 和一个整数 k,找到三个长度为 k 且总和最大的不重叠子数组并返回它们。
返回结果作为表示每个间隔起始位置的索引列表(0-索引)。如果有多个答案,则返回字典顺序最小的一个。
示例1:
示例2:
约束:
解决方案:
我们将使用动态规划方法。这个想法是将问题分解为更小的子问题,利用子数组的重叠来有效计算长度为 k 的三个非重叠子数组的最大和。
预先计算长度为 k 的子数组的总和:
首先,我们计算输入数组 nums 中所有长度为 k 的子数组的总和。通过使用滑动窗口技术,可以在线性时间内有效地完成此操作。
动态规划(DP):
我们创建两个辅助数组(左数组和右数组)来存储截至当前位置找到的最佳子数组的索引。 left[i] 将存储在索引 i 之前结束的最佳子数组的索引,而 right[i] 将存储在索引 i 之后开始的最佳子数组的索引。
迭代并计算最大和:
对于从索引 j 开始的每个可能的中间子数组,我们通过考虑 j 之前的最佳左子数组和 j 之后的最佳右子数组来计算总和。
字典顺序:
如果有多个有效答案(总和相同),我们返回字典顺序最小的一个。这是通过迭代顺序来确保的。
让我们用 PHP 实现这个解决方案:689。 3 个不重叠子数组的最大和
<?php /** * @param Integer[] $nums * @param Integer $k * @return Integer[] */ function maxSumOfThreeSubarrays($nums, $k) { ... ... ... /** * go to ./solution.php */ } // Test cases print_r(maxSumOfThreeSubarrays([1,2,1,2,6,7,5,1], 2)); // [0, 3, 5] print_r(maxSumOfThreeSubarrays([1,2,1,2,1,2,1,2,1], 2)); // [0, 2, 4] ?>
子数组和计算:
左右数组:
最终计算:
字典顺序上最小的答案:
输入:
$nums = [1, 2, 1, 2, 6, 7, 5, 1]; $k = 2;
输出将是:
[0, 3, 5]
这种方法确保了时间复杂度保持高效,时间复杂度约为 O(n),其中 n 是输入数组 nums 的长度。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
以上是。重叠子数组的最大和的详细内容。更多信息请关注PHP中文网其他相关文章!