- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近接受了一次采访,被问到以下算法问题。我无法找到 O(n) 解决方案,也无法通过谷歌找到问题所在。
Given an array A[a_0 ... a_(n-1)] of integers (+ve and -ve). Form an array M[m_0 ... m_(n-1)] where m_0 = 2 and m_i in [2,...,m_(i-1)+1] such that sum of products is maximum i.e. we have to maximize a_0*m_0 + a_1*m_1 + ... + a_(n-1)*m_(n-1)
例子
input {1,2,3,-50,4}
output {2,3,4,2,3}
input {1,-1,8,12}
output {2,3,4,5}
我的 O(n^2) 解决方案是从 m_0=2 开始,只要 a_i 为 +ve 就继续递增 1。如果 a_i < 0,我们必须考虑从 2 到 m_i-1 + 1 的所有 m_i,看看哪个产生最大的乘积。
请提出一个线性时间算法。
最佳答案
假设您有以下数组:
1, 1, 2, -50, -3, -4, 6, 7, 8.
在每个条目中,我们可以继续递增的进程或将值重置为较低的值。
这里只有两个好的选择。我们要么选择当前条目的最大可能值,要么选择最小可能值 (2)。 (最后证明)
现在很明显,我们输出中的前 3 个条目应该是 2、3 和 4(因为到目前为止所有数字都是正数,没有理由将它们重置为 2(低值)。
当遇到负条目时,计算总和:-(50 + 3 + 4) = -57
。
接下来计算连续 +ve 个连续数字的相似和。(6 + 7 + 8) = 21
。
由于 57 大于 21,因此将第 4 个条目重置为 2 是有意义的。
再次计算负项的总和:-(3 + 4) = -7
。
现在 7 小于 21,因此不进一步重置是有意义的,因为如果正值很高,则应获得最大乘积。
因此输出数组应为:
2, 3, 4, 2, 3, 4, 5, 6, 7
为了使该算法在线性时间内工作,您可以预先计算计算中需要的总和数组。
证明:
当遇到负数时,我们可以将输出值重置为低值(例如 j)或继续增加(例如 i)。
假设有 k 个值和 m 个连续的正值。
如果我们将值重置为 j,则这些 k -ve 值和 m +ve 值的乘积值应等于:
- ( (j-2+2)*a1 + (j-2+3)*a2 + ... + (j-2+k+1)*ak ) + ( (j-2+k+2)*b1 + (j-2+k+3)*b2 + ... + (j-2+k+m+1)*am )
如果我们不将该值重置为 2,则这些 k -ve 值和 m +ve 值的乘积值应等于:
- ( (i+2)*a1 + (i+3)*a2 + (i+4)*a3 ... + (i+k+1)*ak ) + ( (i+k+2)*b1 + (i+k+3)*b2 + ... + (i+k+m+1)*am )
因此上面两个表达式的区别是:
(i-j+2)* ( sum of positive values - sum of negative values )
这个数字可以是正数也可以是负数。因此,我们倾向于使 j 尽可能高 (M[i-1]+1) 或尽可能低 (2)。
在 O(N) 时间内预计算总和数组
编辑:正如 Evgeny Kluev 所指出的
注意:在计算后缀和时,如果遇到零值,则可以有多个这样的解。
关于algorithm - 给定数组 A,形成数组 M,使得乘积之和 (a1*m1+...+an*mn) 最大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20159218/
这个问题可能类似于In Angular2 *ngFor iteration, how do I output only unique values from the array?但我的问题是还有更多功
我编写了一个算法来获取 float 的总和,该算法对于整数来说非常有效,但是当我应用于 float 时,我得到的总和是负数。但是我的 float 数组只有正 float 。在这里我发布我的代码,感谢您
我想将这个简单的 for 循环转换为并行循环。它遍历字符串数组(从文本文件读取的 float )并计算总和。 for (int i = 0; i { float tmp; if (f
我正在尝试总结日期差异,一切都很好,除了如果有相同日期我想添加 1,例如,如果起始日期是:01/01/2003到目前为止是 01/01/2003 那么我想添加 1 天,但它没有添加 1 天,而是仅在
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Is JavaScript’s Floating-Point Math Broken? 这将是一个非常基本的计算机科
我刚接触sql,卡住了。我正在尝试计算每个用户走过的(每年)距离总和。我有一个具有以下结构的表(我们称之为 dist_table): rowid user_name date
我刚接触sql,卡住了。我正在尝试计算每个用户走过的(每年)距离总和。我有一个具有以下结构的表(我们称之为 dist_table): rowid user_name date
给定一个正数数组。我想将数组拆分为 2 个不同的子集,以使它们的 gcd(最大公约数)之和最大。 示例数组:{6,7,6,7}。 答案:需要的两个子集是:{6,6}和{7,7};它们各自的 gcd(s
我想在我的数组中求和:
我想将下面的字符串拆分为字母和数字,然后我需要计算数字的总和。我的示例问题是 a[20]={"abcd123dc2"}; 预期输出: abcddc 8 我的代码: int main() { c
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
我是一名优秀的程序员,十分优秀!