- 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/
分别考虑形状为 (m,m) 和 (n,n) 的输入矩阵 X 和 Y。作为输出,我们需要给出一个 (mn,mn) 形状矩阵,使其与两个矩阵中的相应条目相乘。这两个矩阵 X 和 Y 表示转移矩阵。可以采用
基于此http://www.itu.dk/courses/AVA/E2005/StringIndexing.pdf在第 12/36 页 给定一个字符串T[1...n],我们构建一个后缀树。搜索模式是
我正在使用 INET 并想模拟一个由三个接入点 (AP) 和一个移动节点 (MN) 组成的场景,可能每个 AP 在其范围内都有其他关联的 MN,我想要的是:而 MN (在我的场景中)四处移动并从 AP
我需要用 O(nm) 解决以下问题。n = |T|米=|P|其中 T,P 两个字符串f 是评分函数。 算法应返回 T 的子串 T',使得 score(P,T') 值最大。 score(A,B) 是对齐
我的印象是以下函数的时间复杂度为 O(mn),其中 m 和 n 是两个字符串的长度。然而,有人不同意,因为他声称字符串连接涉及字符的复制,因此对于长字符串序列,这将不再是 O(mn)。这听起来很合理。
对于上面的 2 个大 O,如果 n>>m 会发生什么。大O如何变化?在第一种情况下它是否变为 O(n)。如果是,为什么? 最佳答案 这取决于您对m 的最大值的了解(取决于n)。 如果m和n都是自变量O
给定五个正整数,找出可以通过正好将五个整数中的四个相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为由两个空格分隔的长整数组成的一行。 例如 var arr = [1,3,5,7,9]输出将
我有一个 true/false 值的二维数组。我知道它有一些列的所有值为 true,我知道它有一些行的所有值为 false except 它与该列相交。例如: 0 1 2 3 +-----
我正在尝试使用 --custom 选项在 Mininet 中运行 .py 脚本。我的代码如下: from mininet.topo import Topo from mininet.net impor
我在 C# 中有一个数组,其中包含数字(例如 int、float 或 double);我有另一个范围数组(每个范围定义为下限和上限)。我当前的实现是这样的。 foreach (var
我试图通过不同的方法找出算法的复杂性。在数学上,我遇到了一种 O(m+n) 和另一种 O(mn) 方法。但是我无法理解或说形象化这一点。我看着他们并没有那种“啊!原来是这样”的感觉!有人可以使用他们自
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
算法的输入是m和n。 我的算法的时间复杂度是 O(mn)。 我有一个时间复杂度为 O((m+n)²) 的基准算法。 我的实现在时间复杂度方面是否优于基准? 最佳答案 如此多的评论者和回答者希望只考虑
算法的输入是m和n。 我的算法的时间复杂度是 O(mn)。 我有一个时间复杂度为 O((m+n)²) 的基准算法。 我的实现在时间复杂度方面是否优于基准? 最佳答案 如此多的评论者和回答者希望只考虑
我想创建一个模式,其中所需的字符串应该是 a 的倍数,包括 null,即 a*,或者它应该是一个 m 或一个 n。但是下面的代码没有给出所需的输出。 class Solution {
我最近接受了一次采访,被问到以下算法问题。我无法找到 O(n) 解决方案,也无法通过谷歌找到问题所在。 Given an array A[a_0 ... a_(n-1)] of integers (+
给出五个正整数,找出可以通过将五个整数中的四个正好相加而计算出的最小值和最大值。然后将各自的最小值和最大值打印为一行两个空格分隔的长整数。。例如,var arr=[1,3,5,7,9]输出将是16 2
假设我有一个 (M,N) 图像 J(形状为 (M,N,3))。我有一个 (2,MN) 矩阵 K,如下所示: 0 0 0 ... 0 1 1 1 ... 1 ............. M M M ..
我是一名优秀的程序员,十分优秀!