- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们得到一个未排序的整数数组 A
(允许重复),大小 N
可能很大。我们可以计算索引为 i < j
的对的数量,其中 A[i] < A[j]
,我们称之为 X
。
我们可以更改数组中的最大一个元素,代价等于绝对值的差值(例如,如果我们用新数字 k
替换索引 K
上的元素,则代价 Y
为 | A[k] - K |
)。我们只能用数组中找到的其他元素替换此元素。
我们想找到 X + Y
的最小可能值。
一些例子:
可以使用简单的 O(n²)
解决方案找到对的数量,在 Python 中:
def calc_x(arr):
n = len(arr)
cnt = 0
for i in range(n):
for j in range(i+1, n):
if arr[j] > arr[i]:
cnt += 1
return cnt
暴力解决方案很容易编写,例如:
def f(arr):
best_val = calc_x(arr)
used = set(arr)
for i, v in enumerate(arr):
for replacement in used:
if replacement == v:
continue
arr2 = arr[0:i] + replacement + arr[i:]
y = abs(replacement - v)
x = calc_x(arr2)
best_val = min(best_val, x + y)
return best_val
我们可以计算每个元素在 O(n*log(n))
中大于其自身的项目数,例如使用 AVL 树或合并排序的一些变体。但是,我们仍然需要寻找改变哪些元素以及它可以实现哪些改进。
这是作为一个面试问题给出的,我想要一些关于如何有效解决这个问题(数据结构或算法)的提示或见解。
最佳答案
在计算反转时,一定要达到 O(n log n) 的复杂度。
我们可以看到,当您更改索引 k 处的值时,您可以:
1)增加它,然后可能减少元素大于k的反演次数,但增加元素小于k的反演次数
2) 减少它(相反的事情发生)
我们尽量不要每次更改值时都计算 x。您需要了解什么?
案例一):
你必须知道左边有多少元素小于你的新值v,右边有多少元素大于你的值。您可以很容易地在 O (n) 中检查它。那么你现在的x是多少?您可以使用以下公式对其进行计数:
prev_val - your previous value
prev_x - x that you've counted at the beginning of your program
prev_l - number of elements on the left smaller than prev_val
prev_r - number of elements on the right bigger than prev_val
v - new value
l - number of elements on the right smaller than v
r - number of elements on the right bigger than v
new_x = prev_x + r + l - prev_l - prev_r
在第二种情况下,你几乎做相反的事情。
现在你得到的是 O( n^3 ) 而不是 O (n^3 log n),这可能仍然很糟糕。不幸的是,这就是我现在想到的。如果我想出更好的东西,我一定会告诉你。
编辑:内存限制如何?有没有?如果没有,您可以只为数组中的每个元素制作两个集合,其中包含当前元素之前和之后的元素。然后你可以在 O (log n) 中找到更小/更大的数量,使你的时间复杂度为 O (n^2 log n)。
编辑 2:我们还可以尝试检查,对于每个可能的值 v,哪个元素最适合更改为值 v。您可以制作两个集合并在检查每个元素时从中添加/删除元素,使时间复杂度为 O(n^2 log n) 而无需使用太多空间。所以算法将是:
1) 确定你可以改变任何元素的每一个值v,计算x
2) 对于每个可能的值 v:
编辑 3:您可以使用前缀总和作为一个值,而不是制作两组。这已经是 O (n^2),但我认为我们可以做得更好。
关于arrays - 最大化数组中的反转计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51246932/
给定一个包含 n 个非负整数的数组:A1、A2、...、AN。如何找到一对整数 Au, Av (1 ≤ u ans) { ans=arr[i] & arr[j
有人知道这段代码的正确解决方案吗? BOOL maximized = [myWindow isMaximized]; 最佳答案 也许看看 isZoomed 关于cocoa - NSWindow 最大化
当前有一个 MySQL 数据库,但遇到 MySQL 以 600% CPU 使用率运行的问题。 规范: 2.3 GHz Intel Xeon® E5-2686 v4 (Broadwell) 处理器或 2
我已将 Skype 配置为在 Windows 启动时最小化启动。 现在我需要通过全屏应用程序按钮中的一个按钮将 Skype 置于最前面。我有这段代码: For Each p As Proces
我已经有一段时间没有做任何生疏的程序了。我正在研究代码以最大化和最小化其他应用程序。所以我找到了一些基本的东西,这就是我所拥有的,对原来的东西稍作修改。它希望我生成一些我所做的 FindWindow
我有一个 Windows CE 应用程序,它记录移动设备的击键。有一个用于初始化录制功能的按钮,它通过调用强制主窗口最小化: ShowWindow (hWnd, SW_MINIMIZE); 在最小化窗
我想显示一个占据尽可能多屏幕空间的对话框。 所以,这是一个示例: AlertDialog dialog = new AlertDialog.Builder(ctx)......create(); Wi
对Wndows用户来说,最小化/最大化/关闭按钮放在系统窗口的右上角是肯定的。而大多数朋友都是成为Wndows用户之后才成为Ubuntu用户的,因此Ubuntu程序窗口中将这些按键放在左上角使用起来
1.Ctrl+Alt+T调出终端 2.首先安装gconf-editor: sudo apt-get install gconf-editor 会提示叫你安装 gconf-editor 安装完成
Width最大化窗口时,屏幕的属性似乎没有更新到完全最大化的宽度。如果我调整它的大小,一切正常,但在最大化时就不行。 我的代码如下: private void Window_SizeChanged(o
我正在这个 fiddle 中使用指令和 = 绑定(bind)。我收到以下错误: Uncaught Error: 10 $digest() iterations reached. Aborting! W
是否有任何快捷方式可以最大化您在 Eclipse 中使用的选项卡?假设我正在处理代码的一部分,并且我想最大化选项卡而不是使用鼠标双击它,有人知道一种方法吗? 最佳答案 CtrlM 将最大化/恢复编辑器
在 Glassdoor 评论中遇到这个问题,觉得很有趣。 Given an integer consisting of 4 digits, we need to maximize it in 24 h
在 VB6 中,我创建了一个带有一些文本框、列表框和命令按钮的表单。我使用类似 的方法设置所有这些控件的 X-Y 位置 control2.Top = form.Height * 0.50 'set
到处都有人告诉我使用这个: frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 但问题是我的 JMenuBar 时断时续地消失(发生在我身上的奇怪错误),并且
我有一个 JDesktopPane 和一个 JInternalFrame。我希望 JInternalFrame 在创建后自动最大化。如何对“最大化窗口”事件进行硬编码? 最佳答案 使用JInterna
这个问题已经有答案了: JFrame doesn't take the actual screen size (2 个回答) 已关闭 3 年前。 我想最大化我的 JFrame,就像按下“关闭”旁边的按
我正在使用 vim 和 python 编程,并使用 tpope's vim-dispatch通过运行当前文件 :Dispatch python main.py 程序的打印输出被定向到quickfix窗
假设我们有一个名为 total 的 NSDecimal 常量,它包含 3.33333333 除以 10/3 的值。 10 和 3 都是NSDecimalNumber。我们希望 Swift 中的 NSD
有谁知道如何在发生特定操作后最大化 JFrame?我将在下面发布我的代码,我是一个不评论我的代码的恶魔(我会在某个时候这样做)但它应该是相当 self 解释的。我试图做的是在从菜单中选择选项后使框架最
我是一名优秀的程序员,十分优秀!