问题:给定一个数组'arr'和一个整数'k',找到所有大小不超过'k'的子数组的最大和。注意不能选择连续或重叠的子数组。
约束条件: 0 <= arr.size() <= 10^5; 0 <= arr[i] <= 10^5; 1 <= k <= 10^5;
例如:
arr = [1, 10, 7, 3, 4] and k = 1。答案将是14。 解释:我们只能选择大小为1的子数组,所以我们将选择[10]和[4],它们的和为14。你不能选择[10],[7],[4],因为[10]和[7]是连续的子数组。
arr = [15 9 11 11 1 12 18 18 18 8 1] and k = 3。答案应该是94。 解释:子数组是[15],[11, 11],[12, 18],[18, 8, 1],这些和为94。
这是House Robber问题的更新版本,可以通过动态规划轻松解决:
dp[i] = max(dp[i-2] + arr[i], dp[i-1])
我可以通过在动态数组中添加一个维度来解决这个问题:
约束条件: 0 <= arr.size() <= 10^5; 0 <= arr[i] <= 10^5; 1 <= k <= 10^5;
例如:
arr = [1, 10, 7, 3, 4] and k = 1。答案将是14。 解释:我们只能选择大小为1的子数组,所以我们将选择[10]和[4],它们的和为14。你不能选择[10],[7],[4],因为[10]和[7]是连续的子数组。
arr = [15 9 11 11 1 12 18 18 18 8 1] and k = 3。答案应该是94。 解释:子数组是[15],[11, 11],[12, 18],[18, 8, 1],这些和为94。
这是House Robber问题的更新版本,可以通过动态规划轻松解决:
dp[i] = max(dp[i-2] + arr[i], dp[i-1])
我可以通过在动态数组中添加一个维度来解决这个问题:
dp[i][j] = max(dp[i-2][j-1] + arr[i], dp[i-1][k])
但问题是,上述解决方案在最坏情况下会超过时间限制:k = 10^5 和 arr.size() = 10^5。即使当 k = 10^4 和 arr.size() = 10^4 时,它的运行速度也非常慢,因为时间复杂度为 O(n*k)。
我尝试过从以 arr[0:k+1] 开始的子数组中移除最小值,然后继续在 arr(j+1:j+k+1)(j 是被移除值的索引)中移除,但结果出现了错误。
有没有办法降低这个解决方案的时间复杂度呢?
感谢您花费时间阅读。
k
。我只是从另一个角度看问题;如果答案正确的话,我认为使用哪个问题陈述应该无关紧要。也许我忽略了明显的东西,但你能解释一下为什么你认为“打劫房屋”问题的维度较小吗? - Neil