- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这里是问题陈述:
You have a lightbulb for an interval of N seconds, where N is given. At time 0, the lightbulb switches on, and at time N, it switches off, regardless of any switches. From time 1 to time N-1 you have a maximum of N-2 switches in the form of an array called switches, which turn the lightbulb to the opposite of what it currently is i.e. if it's on it'll turn off and vice versa. For example suppose N = 8 and switches = [1,2]. The lightbulb will switch on at time 0, a switch at time 1 will turn it off, a switch at time 2 will turn it on, and it'll remain on until time 8, when it turns off. Hence, the time it remains on is equal to 1-0 + 8-2 = 7.
Now suppose you have to insert a switch in this interval, where there is not already a switch present. What is the maximum time the lightbulb remains on once you insert the switch. For example, in the above case, the solution would be 6 since inserting a switch at time 7 keeps the time the lightbulb spends on maximum. Since 1-0 + 7-2 = 6, the answer is 6.
我使用暴力解决方案解决了这个问题,使用的推理是如果你在时间 k 插入一个开关,在此之前灯泡的状态不会受到影响,并且灯泡从时间 k 到时间的状态N 将被反转,因此您可以通过 (N - k) - t 找到它在时间 k 之后花费的时间,其中 t 是它在没有插入开关的情况下从时间 k 到 N 花费的时间。因此,我可以计算出灯泡在插入开关的每个时间位置所花费的时间并将其最大化。但是,由于计算灯泡点亮的时间是一个 O(n) 操作,并且我遍历了所有可能的位置,所以我的解决方案是 O(n^2),这导致我的代码在某些测试用例中超时。
有人可以提出更好的解决方案吗?
最佳答案
如果我们在之前打开的 block 中插入,就像在您的示例中一样,我们希望将它插入到尽可能接近 on
时间段的末尾。如果我们要插入之前的 off
block ,我们会将其放置在尽可能靠近该周期开始的位置,以最大化该 block 的新 on
时间。
要在 O(1)
中计算任何一个选择的效用,我们可以引用从数组末尾开始累积的交错前缀和。 (正如 Nico Schertler 在上面所评论的那样,我们可以在具有恒定空间的末尾的单个遍历中动态地执行整个计算 - 留作练习:)
例如,给定 N = 10 和开关 = [3,6],我们有:
3-0, 6-3, 10-6
on , off, on
(skip every other value)
<- - - - - -
Reversed prefix sums 1:
7 , (4), 4
Reversed prefix sums 2:
(3) , 3 , (0)
当我们遍历输入时,尝试每个 block ,我们的选择不会像您建议的那样影响左边的总和。我们可以从我们的前缀中得到右边的总和:
block 0: since it's previously `on`
we'd place it towards the end
at 2, resulting in
2-0 (reduced from 3-0) +
(0 for 3-2 time units when it's off) +
3 (prefix sum in the next block)
= 5
block 1: since it's previously `off`
we'd place it towards the start
at 4, resulting in
3 (accumulated) +
6-4 for when it's now on +
0 (prefix sum in the next block)
= 5
block 2: since it's previously `on`
we'd place it towards the end
at 9, resulting in
3 (accumulated) +
9-6 (reduced from 10-6) +
(0 for 10-9 time units when it's off) +
= 6
关于algorithm - 面试题: Insert switch to maximize time lightbulb spends on,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53847955/
基本上我正在创建这个网站,我将包装器设置为 100% 宽度,当浏览器最大化时它工作正常,但如果没有最大化它并且你向右滚动,内容在结束时被切断内容容器并没有完全拉伸(stretch)??在这里询问之前,
我想知道如何在新的最大化框架中启动 emacsclient。 emacsclient -c 启动一个新框架,但手册页指示无法最大化此框架。没有像 --maximized 这样的选项. 警告:这不是来自
在一次招聘会上,我被问到以下棘手的问题(不完全是下面的,我剥离了这个故事并(或多或少)正式地表达了这个问题)。 Given number K, and a finite list of pairs L
换句话说,有人可以发布在简单图形中找到“最大”独立集的说明吗? 我从 ETH 网站上读到一些东西,上面说人们可以通过简单地选择一个随机顶点 v 然后扫描其余的顶点并尝试找出从 v 到其余的顶点是否存在
题目地址: https://leetcode.com/problems/maximal-square/description/ 题目描述 Given a 2D binary matrix fill
我无法运行以下代码: from gekko import GEKKO # data to be spline to find maximum x = [-1.0, -0.6, -0.2, 0.2, 0
我试图让一张图片占据用户屏幕的 70%。但是,如果在加载页面时屏幕变小或者用户打开了检查元素,则图片会变小并被拉伸(stretch)。我相信最好的解决方案是找到浏览器窗口的最大高度并将图像设置为该大小
我现在正在自己练习动态规划。对于经典问题“矩阵链乘法”,就是求标量乘法的最小数。即, M[i,j] = 0 if i=j = Min(in,则由a1 ... ai 和ai + 1 ...
(注意:我考虑过在 https://cstheory.stackexchange.com/ 上提出这个问题,但认为我的问题不够理论化——它是关于算法的。如果这篇文章有更好的 Stack Exchang
我正在开发一个自定义窗口,以便为我的应用程序添加更多样式。 我遵循了一些教程来启用基本的窗口行为: 结束 最大化 最小化 move 调整大小 这些都可以。 我想知道 Windows 7 的功能是什么:
我用 C# 编写了一个并行算法,将一个数组分成两个列表,一个包含满足给定谓词的元素,另一个列表包含不满足给定谓词的元素。它是一种保序算法。 我是这样写的,但是我想知道如何最大限度地利用硬件并发的机会。
给定上限 d和一个整数数组,返回元素总和为 maximalSubsetsWithinCapacity(int[] a, int capacity) { List b = new ArrayL
给定一个描述节点对之间连接的 bool 值的二维表,是否有一种有效的方法来找到最大的节点子集,其中所有节点都连接到所有节点? 具有 6 个节点的示例: 在这种情况下,“最大连通集”是{node1, n
我在 Ted Talk 链接中看到了 Alex Wissner-gross 和他的智能行为理论 Here .我试图阅读链接的学术论文 Here ,这与他的演讲有关,但我对数学和物理学的理解不够,无法真
题目地址:https://leetcode.com/problems/maximize-distance-to-closest-person/description/ 题目描述 Ina row o
我创建了一个带有托盘图标的 Electron 应用程序。 右键单击任务栏图标时,将显示一个包含4个选项的菜单: 最小化 最大化 重新启动 退出 这是创建任务栏图标的代码: trayIcon =
我正在编写一个依赖于许多其他包的 R 包。当我在 session 中加载太多包时,我经常收到此错误: Error in dyn.load(file, DLLpath = DLLpath, ...) :
我正在尝试找到一种干净的方法,当用户单击最大化按钮时,将我的应用程序置于全屏模式(而不是最大化模式)。问题是,我找不到任何事件来识别何时单击最大化按钮。 我问这个问题的原因是我有一个以全屏模式运行的
我正在尝试找到一种干净的方法,当用户单击最大化按钮时,将我的应用程序置于全屏模式(而不是最大化模式)。问题是,我找不到任何事件来识别何时单击最大化按钮。 我问这个问题的原因是我有一个以全屏模式运行的
假设有一个向量 H ,剂量“通过它的最大值归一化向量”意味着 H/max(H)? H 中的每个元素除以 H 的最大值? 最佳答案 将向量的每个元素除以向量的最大值,以便每个值都落在 [0, 1] 或
我是一名优秀的程序员,十分优秀!