我正在尝试解决最新的 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/
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
出于某种原因,我必须为Firefox禁用javascript(手动,我们按照提到的步骤执行http://support.mozilla.org/en-US/kb/javascript-settings-for-interactive-web-pages#w_enabling-and-disabling-javascript)。使用Ruby的SeleniumWebDriver如何实现这一点? 最佳答案 是的,这是可能的。而是另一种方式。您首先需要查看链接Selenium::WebDriver::Firefox::Profile#[]=
只是想更新到最新版本的Ruby。在ruby-lang.org/en/documentation/installation/#homebrew上,我发现你应该可以通过自制软件来完成:brewinstallruby但是,当我在“更新”后列出ruby版本(ruby-v)时,它仍然是旧版本2.0.0。Hermes:~Sancho$ruby-vruby2.0.0p481(2014-05-08revision45883)[universal.x86_64-darwin13]我碰巧列出了/usr/local/bin/的内容,我可以看到一个符号链接(symboliclink):ruby->..
我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click
看完文章http://jeffkreeftmeijer.com/2011/method-chaining-and-lazy-evaluation-in-ruby/,我开始寻找更好的方法链和惰性求值解决方案。我想我已经用以下五个规范概括了核心问题;谁能让他们全部通过?任何事情都可以:子类化、委托(delegate)、元编程,但不鼓励后者。最好将依赖性保持在最低限度:require'rspec'classFoo#EpiccodehereenddescribeFoodoit'shouldreturnanarraycorrespondingtothereverseofthemethodchai