- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试解决最新的 codility.com 问题(只是为了提高我的技能)。我试过分配但没有得到超过 30 分,所以现在很好奇我的解决方案中到底缺少什么。
问题是
给定一个由 N 个整数组成的非空零索引数组 A。峰是一个数组元素,它比它的邻居大。更准确地说,它是一个索引 P,使得
0 < P < N − 1 and A[P − 1] < A[P] > A[P + 1]
例如下面的数组A:
A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
恰好有四个峰:元素 1、3、5 和 10。
你要去一系列山脉旅行,其相对高度由数组 A 表示。你必须选择你应该带多少旗帜。目标是根据特定规则在山峰上设置最大数量的标志。
只能在峰上设置标志。另外,如果取K个flags,那么任意两个flags之间的距离应该大于等于K。索引P和Q之间的距离是绝对值|P − Q|。
例如,给定上面数组 A 表示的山脉,N = 12,如果您采用:
> two flags, you can set them on peaks 1 and 5;
> three flags, you can set them on peaks 1, 5 and 10;
> four flags, you can set only three flags, on peaks 1, 5 and 10.
因此在这种情况下您最多可以设置三个标志。
编写一个函数,给定一个包含 N 个整数的非空零索引数组 A,返回可以在数组的顶点上设置的最大标志数。例如,给定上面的数组
函数应该返回 3,如上所述。
假设:
N为[1..100,000]范围内的整数;
数组A的每个元素都是[0..1,000,000,000]范围内的整数。
复杂度:
预期的最坏情况时间复杂度为 O(N);预期的最坏情况空间复杂度为 O(N),超出输入存储(不计算输入参数所需的存储空间)。
所以我根据我对问题的理解尝试了这段代码
var A = [1,5,3,4,3,4,1,2,3,4,6,2];
function solution(A) {
array = new Array();
for (i = 1; i < A.length - 1; i++) {
if (A[i - 1] < A[i] && A[i + 1] < A[i]) {
array.push(i);
}
}
//console.log(A);
//console.log(array);
var position = array[0];
var counter = 1;
var len = array.length;
for (var i = 0; i < len; i++) {
if (Math.abs(array[i+1] - position) >= len) {
position = array[i+1];
counter ++;
}
}
console.log("total:",counter);
return counter;
}
以上代码适用于示例数组元素:[1,5,3,4,3,4,1,2,3,4,6,2]
在索引处获取峰值:[1, 3, 5, 10]
并在 1、5 和 10(总共 3 个)处设置标志
但是 codility.com 说它在数组 [7, 10, 4, 5, 7, 4, 6, 1, 4, 3, 3, 7] 上失败了
我的代码在索引处达到峰值:[1, 4, 6, 8]
并将标志设置为 1 和 6(总共 2 个)但 coditity.com 说它应该是 3 个标志。 (不知道为什么)我是否误解了这个问题?
拜托,我只是在寻找提示/算法。我知道这个问题已经被某人问过并在私有(private)聊天室中解决了,但在那个页面上我试图从那个人那里获得帮助但成员们宁愿将我的帖子标记为不合适的答案所以我在这里再次问这个问题。
P.S:您可以尝试自己编写挑战代码 here !
最佳答案
这是一个具有更好复杂性上限的解决方案:
O(sqrt(N) * log(N))
O(1)
(在原始输入存储上)from math import sqrt
def transform(A):
peak_pos = len(A)
last_height = A[-1]
for p in range(len(A) - 1, 0, -1):
if (A[p - 1] < A[p] > last_height):
peak_pos = p
last_height = A[p]
A[p] = peak_pos
A[0] = peak_pos
def can_fit_flags(A, k):
flag = 1 - k
for i in range(k):
# plant the next flag at A[flag + k]
if flag + k > len(A) - 1:
return False
flag = A[flag + k]
return flag < len(A) # last flag planted successfully
def solution(A):
transform(A)
lower = 0
upper = int(sqrt(len(A))) + 2
assert not can_fit_flags(A, k=upper)
while lower < upper - 1:
next = (lower + upper) // 2
if can_fit_flags(A, k=next):
lower = next
else:
upper = next
return lower
O(N)
预处理(就地完成):
A[i] := next peak or end position after or at position i
(i for a peak itself, len(A) after last peak)
如果我们能种植k
旗帜然后我们当然可以种植k' < k
旗帜也是如此。如果不能种植k
插旗那我们肯定不能种k' > k
旗帜。我们总是可以设置 0 个标志。让我们假设我们不能设置 X
旗帜。现在我们可以使用二分查找来找出究竟可以插多少旗。
Steps:
1. X/2
2. X/2 +- X/4
3. X/2 +- X/4 +- X/8
...
log2(X) steps in total
经过之前的预处理,每一步检测是否k
可以插旗可以在O(k)
中执行操作:
总成本 - 最坏情况 - 当 X - 1
可以插旗:
== X * (1/2 + 3/4 + ... + (2^k - 1)/(2^k))
== X * (log2(X) - 1 + (<1))
<= X * log(X)
使用 X == N
会起作用,而且很可能也是次线性的,但不足以证明该算法的总上限低于 O(N)
。 .
现在一切都取决于找到一个好的X
, 它自 k
旗帜大约需要 k^2
适合的位置,似乎应该在 sqrt(N)
附近找到一个很好的标志数量上限。 .
如果X == sqrt(N)
或接近它的东西起作用,然后我们得到 O(sqrt(N) * log(sqrt(N)))
的上限这绝对是次线性的,因为 log(sqrt(N)) == 1/2 * log(N)
该上限相当于 O(sqrt(N) * log(N))
.
让我们在 sqrt(N)
附近寻找所需标志数量的更精确上限:
k
标志需要 Nk := k^2 - k + 3
旗帜k^2 - k + 3 - N = 0
在 k
我们发现如果 k >= 3
, 然后任意数量的标志 <= 结果 k
可以适合一些长度为 N 的序列,而更大的则不能;该方程的解是1/2 * (1 + sqrt(4N - 11))
N >= 9
我们知道我们可以放 3 面旗帜==> 对于 N >= 9
, k = floor(1/2 * (1 + sqrt(4N - 11))) + 1
是我们可以容纳的标志数量的严格上限 N
N < 9
我们知道 3 是一个严格的上限,但这些情况与我们寻找大 O 算法复杂度无关floor(1/2 * (1 + sqrt(4N - 11))) + 1
== floor(1/2 + sqrt(N - 11/4)) + 1
<= floor(sqrt(N - 11/4)) + 2
<= floor(sqrt(N)) + 2
==> floor(sqrt(N)) + 2
对于可以放入 N
中的许多标志也是一个很好的严格上限元素 + 这个甚至适用于 N < 9
所以它也可以在我们的实现中用作通用的严格上限
如果我们选择X = floor(sqrt(N)) + 2
我们得到以下总算法上限:
O((floor(sqrt(N)) + 2) * log(floor(sqrt(N)) + 2))
{floor(...) <= ...}
O((sqrt(N) + 2) * log(sqrt(N) + 2))
{for large enough N >= 4: sqrt(N) + 2 <= 2 * sqrt(N)}
O(2 * sqrt(N) * log(2 * sqrt(N)))
{lose the leading constant}
O(sqrt(N) * (log(2) + loq(sqrt(N)))
O(sqrt(N) * log(2) + sqrt(N) * log(sqrt(N)))
{lose the lower order bound}
O(sqrt(N) * log(sqrt(N)))
{as noted before, log(sqrt(N)) == 1/2 * log(N)}
O(sqrt(N) * log(N))
QED
关于javascript - Peak and Flag Codility 最新挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19466115/
我有一个 html 格式的表单: 我需要得到 JavaScript在value input 字段执行,但只能通过表单的 submit .原因是页面是一个模板所以我不控制它(不能有
我管理的论坛是托管软件,因此我无法访问源代码,我只能向页面添加 JavaScript 来实现我需要完成的任务。 我正在尝试用超链接替换所有页面上某些文本关键字的第一个实例。我还根据国家/地区代码对这些
我正在使用 JS 打开新页面并将 HTML 代码写入其中,但是当我尝试使用 document.write() 在新页面中编写 JS 时功能不起作用。显然,一旦看到 ,主 JS 就会关闭。用于即将打开的
提问不是为了解决问题,提问是为了更好地理解系统 专家!我知道每当你将 javascript 代码输入 javascript 引擎时,它会立即由 javascript 引擎执行。由于没有看过Engi
我在一个文件夹中有两个 javascript 文件。我想将一个变量的 javascript 文件传递到另一个。我应该使用什么程序? 最佳答案 window.postMessage用于跨文档消息。使
我有一个练习,我需要输入两个输入并检查它们是否都等于一个。 如果是 console.log 正则 console.log false 我试过这样的事情: function isPositive(fir
我正在做一个Web应用程序,计划允许其他网站(客户端)在其页面上嵌入以下javascript: 我的网络应用程序位于 http://example.org 。 我不能假设客户端网站的页面有 JQue
目前我正在使用三个外部 JS 文件。 我喜欢将所有三个 JS 文件合而为一。 尽一切可能。我创建 aio.js 并在 aio.js 中 src="https://code.jquery.com/
我有例如像这样的数组: var myArray = []; var item1 = { start: '08:00', end: '09:30' } var item2 = {
所以我正在制作一个 Chrome 扩展,它使用我制作的一些 TamperMonkey 脚本。我想要一个“主”javascript 文件,您可以在其中包含并执行其他脚本。我很擅长使用以下行将其他 jav
我有 A、B html 和 A、B javascript 文件。 并且,如何将 A JavaScript 中使用的全局变量直接移动到 B JavaScript 中? 示例 JavaScript) va
我需要将以下整个代码放入名为 activate.js 的 JavaScript 中。你能告诉我怎么做吗? var int = new int({ seconds: 30, mark
我已经为我的 .net Web 应用程序创建了母版页 EXAMPLE1.Master。他们的 I 将值存储在 JavaScript 变量中。我想在另一个 JS 文件中检索该变量。 示例1.大师:-
是否有任何库可以用来转换这样的代码: function () { var a = 1; } 像这样的代码: function () { var a = 1; } 在我的浏览器中。因为我在 Gi
我收到语法缺失 ) 错误 $(document).ready(function changeText() { var p = document.getElementById('bidp
我正在制作进度条。它有一个标签。我想调整某个脚本完成的标签。在找到可能的解决方案的一些答案后,我想出了以下脚本。第一个启动并按预期工作。然而,第二个却没有。它出什么问题了?代码如下: HTML:
这里有一个很简单的问题,我简单的头脑无法回答:为什么我在外部库中加载时,下面的匿名和onload函数没有运行?我错过了一些非常非常基本的东西。 Library.js 只有一行:console.log(
我知道 javascript 是一种客户端语言,但如果实际代码中嵌入的 javascript 代码以某种方式与在控制台上运行的代码不同,我会尝试找到答案。让我用一个例子来解释它: 我想创建一个像 Mi
我如何将这个内联 javascript 更改为 Unobtrusive JavaScript? 谢谢! 感谢您的回答,但它不起作用。我的代码是: PHP js文件 document.getElem
我正在寻找将简单的 JavaScript 对象“转储”到动态生成的 JavaScript 源代码中的最优雅的方法。 目的:假设我们有 node.js 服务器生成 HTML。我们在服务器端有一个对象x。
我是一名优秀的程序员,十分优秀!