我一直在练习算法问题,我遇到了这个问题。
给定一个数组(+VE和-VE),我必须找到一个连续的子数组,这样,和可以被任意数K整除,并且该子数组可能是最大和。对于a={1,2,2,1,1,1,4,5,3}
和k=5
,可被k整除的最大和子数组是{2,2,1,1,4,5},sum=15
,目前我所能想到的是,每个元素都有两种可能,要么包含在目标子数组中,要么不包含在目标子数组中。但这将是一个指数算法。
编辑:是否有可能在线性时间内解决这个问题。请帮忙
此问题的关键字是前缀和。
计算它们的伪代码如下所示:
int prefix_sum[N];
prefix_sum[0] = array[0];
for (i = 1; i < n; i++)
prefix_sum[i] = prefix_sum[i-1] + array[i];
现在我们有了前缀和,剩下的唯一事情就是找到子数组。我们可以通过从最后一个前缀和值中减去子数组的第一个前缀和值来查看子数组的和。
细节是非常复杂的,因为你必须寻找正确的索引,你必须关心所有的异常情况(比如什么都没有找到…),但我想你会明白算法的概念。它的运行时间是O(n),由于前缀sum,它应该适用于负数和正数。
求其和可被K整除的最长子数组。在O(n)中可能吗?如果不是,它能比n^2更好地完成吗?
求给定数组的连续子集的最大可能差之和。 我们得到一个由n个非负整数(允许重复元素)组成的数组arr[],求出给定数组中相邻子集的最大差之和。 假设max(s)表示任何子集's'中的最大值,而min(s)表示集合's'中的最小值。我们需要为所有可能的子集找到max(s)-min(s)的总和。 解释: 约束条件: 这是从此处获取的代码,但此代码检查所有可能的子集,而不是连续的子集: 那么如何只得到连续
子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。
问题内容: 假设我们有一个整数数组:a = {2,4,3,5} 我们有k = 3。 我们可以将数组a拆分为k(3)个子数组,其中数组的顺序无法更改。每个子阵列的总和必须尽可能低,以使所有子阵列之间的最大总和尽可能低。 对于上述解决方案,这将给出{2,4},{3},{5},其最大和为6(4 + 2)。 错误的答案将是{2},{4、3},{5},因为在这种情况下,最大总和为7(4 + 3)。 我尝试创
假设数组是,现在获取此数组的所有子数组。对于每个子数组,在该子数组中找到最小值,也找到该子数组中的项目之和。最后添加所有这些值。输入无法按我想要的所有可能的子数组进行排序。 例子: 可能的子阵列包括: 最后,将所有这些值相加,得到结果=1 3 6 4 10 9=33。 约束:数组元素的范围从1到1000\u 000\u 000。数组大小从1到100\u 000。将输出作为模块7 1000\u 00
O(n^2)算法简单。有没有人对此有更好的算法?