- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有人问我这个问题:
给你两个整数列表,每个列表都按升序排序,每个列表的长度为 n。两个列表中的所有整数都不同。您希望找到两个列表的并集的第 n 个最小元素。 (也就是说,如果您连接列表并按升序对结果列表进行排序,则元素将位于第 n 个位置。)
我的解决方案:假设列表是 0 索引的。
O(n) 解:一个直接的解决方案是观察数组已经排序,所以我们可以合并它们,并在 n 步后停止。前n-1个元素不需要复制到一个新数组中,所以这个解决方案需要 O(n) 的时间和 O(1) 的内存。
O(log2 n) 解:O(log2 n) 解决方案对每个列表使用交替二分查找。简而言之,它在第一个列表(l1[p1])中获取当前搜索间隔中的中间元素,并在 l2 中搜索它。由于元素是唯一的,我们将找到最多 2 个最接近 l1[p1] 的值。根据它们相对于 l1[p1-1] 和 l1[p1 + 1] 的值以及它们的索引 p21 和 p22,我们要么返回第 n 个元素,要么递归:如果(最多)3 l1 中的索引可以与 l2 中的(最多)2 个索引之一组合,以便 l1[p1'] 和 l2[p2'] 在两个列表和 p1' + 的排序联合中彼此相邻p2' = n 或 p1' + p2' = n + 1,我们返回 5 个元素之一。如果 p1 + p2 > n,我们递归到 l1 中搜索区间的左半部分,否则我们递归到右区间。这样,对于 l1 中 O(log n) 可能的中点,我们在 l2 中进行 O(log n) 二进制搜索。因此运行时间为O(log2 n)。
O(log n) 解:假设列表 l1 和 l2 对其任何元素的访问时间都是恒定的,我们可以使用二进制搜索的修改版本来获得 O(log n) 解决方案。最简单的方法是仅在一个列表中搜索索引 p1,并在另一个列表中计算相应的索引 p2,以便始终使 p1 + p2 = n。 (这假设列表是从 1 开始索引的。)首先,我们检查一个列表的所有元素都小于另一个列表中的任何元素的特殊情况:如果 l1[n] < l2[0] 返回 l1[n]。如果 l2[n] < l1[0] 返回 l2[n]。如果在这一步之后我们没有找到第 n 个最小的元素,则使用近似的伪代码调用 findNth(1,n):
findNth(start,end)
p1 = (start + end)/2
p2 = n-p1
if l1[p1] < l2[p2]:
if l1[p1 + 1] > l2[p2]:
return l2[p2]
else:
return findNth(p1+1, end)
else:
if l2[p2 + 1] > l1[p1]:
return l1[p1]
else:
return findNth(start,p1-1)
当 l2[p2] 恰好大于 p1 + p2-1 = n-1 个元素时,返回元素 l2[p2](因此是第 n 个最小的)。 l1[p1] 在相同但对称的条件下返回。如果 l1[p1] < l2[p2] 且 l1[p1+1] < l2[p2],则 l2[p2] 的秩大于 n,因此我们需要从 l1 中获取更多元素,从 l2 中获取更少元素。因此,我们在前一个搜索区间的上半部分搜索 p1。另一方面,如果 l2[p2] < l1[p1] 且 l2[p2 + 1] < l1[p1],则 l1[p1] 的秩大于 n。因此,真正的 p1 将位于我们当前搜索间隔的下半部分。由于我们在每次调用 findNth 时将问题的大小减半,并且我们只需要做恒定的工作即可将问题的大小减半,因此该算法的递归是T(n) = T(n/2) +O(1),它有一个 O(log n) 时间的解。
面试官不断问我针对上述问题的不同做法。我提出了以上三种做法。它们是否正确?这个问题还有其他最佳解决方案吗?实际上这个问题问了很多次所以请提供一些关于它的好东西。
最佳答案
不确定您是否看过这个:http://www.leetcode.com/2011/01/find-k-th-smallest-element-in-union-of.html
这解决了您所问问题的更一般化版本。日志复杂性绝对是可能的...
关于arrays - 列表的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8999610/
基本上在 excel 中,我想要一个表格,就像下面右边给出的那个(我的数据规模比给出的例子大很多),它有每个主题的中位数,每个条件(例如 TADA、TADP、TPDA , TPDP)。理想情况下,我会
我有一个大小为5000 * 5000的矩阵,其90%的值为0。是否有现成的解决方案可用来计算排除“0”后该矩阵的均值,中位数? 一种粗制解决方案是将所有0更改为NA并使用 median(x, na.
这个问题已经有答案了: Mean per group in a data.frame [duplicate] (8 个回答) 已关闭 9 年前。 我有一个数据框,详细记录了客户花了多少钱,如下所示:
这是我的代码,用于打印所有职业的平均值和中位数。 occupation_lst = ['ALL OCCUPATIONS', 'MANAGEMENT', 'Chief executives', 'Gen
我的 csv 文件中有一个数据集,如下所示: teacher student student grade Jon marin
如何在 C 中不使用数组的情况下找到一组数字的平均值、中位数?问题不是找到平均值或中位数的方法,而是如果不允许使用数组,如何存储一组数字并对它们执行一些操作? 最佳答案 一个有趣的问题。 关键是找到一
我正在使用 SQL Server 2008 如果我有这样的表: Code Value ----------------------- 4 240 4 299 4 21
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我需要从输入文件中查找平均值、中位数、众数和范围。 [input file has the numbers{60,75,53,49,92,71}] 我不知道如何打印范围内的计算结果或计算众数。 这很糟
这个问题已经有答案了: Division of integers in Java [duplicate] (7 个回答) 已关闭 7 年前。 public static double calcMed
当我输入 1,2,3 时我的中位数计算有问题我的中位数是 = 44 我不知道为什么 double wynik = 0; string x1 = textBox1.Text; string[] tab
我的中位数 3 实现在这里运行不正常。我必须为媒体随机选择 3 个数字,这是我的代码,请帮助我。 #include"stdafx.h" #include #include using namespa
我有一个文件,其中有如下几秒钟的数字: 0.01033 0.003797 0.02648 0.007583 0.007491 0.028038 0.012794 0.00524 0.019655 0.
是否有任何函数(作为数学库的一部分)可以计算 mean 、中位数、众数和范围来自一组数字。 最佳答案 是的,似乎确实有第三个库(Java Math 中没有)。出现的两个是: http://opsres
我目前正在尝试从具有两个条件的一系列数据中提取中位数。本质上相当于下面的 AVERAGEIFS(),我工作得很好。 AVERAGEIFS(): =AVERAGEIFS(Analysis!$F:$F,A
我有一个 pandas 数据框,看起来像这样: 给定行中的每个值要么是相同的数字,要么是 NaN。我想计算数据框中所有两列组合的平均值、中位数和获取计数,其中两列都不是 NaN。 例如,上述数据帧的结
我有以下数据: [4.1, 4.1, 4.1, 4.2, 4.3, 4.3, 4.4, 4.5, 4.6, 4.6, 4.8, 4.9, 5.1, 5.1, 5.2, 5.2, 5.3, 5.3, 5
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
一组整数作为输入。您必须返回该集合的子集,以便该子集的均值 - 中位数最大。 示例 1 输入 {1,2,3,4} 输出 {1,2,4} 例子2 输入 {1,2,2,3,3} 输出 {2,2,3} 最佳
我是一名优秀的程序员,十分优秀!