好吧,这是我很多次遇到的难题-给定一组12个球,其中一个有缺陷(重量较小或较大)。您可以称量3次以找出有缺陷的产品,并告诉您称重的是更少还是更多。
存在解决此问题的方法,但是我想知道我们是否可以通过算法确定给定一组“ n”个球是否需要使用光束平衡来确定哪一个有缺陷以及如何(更轻或更重)。
可以在这里找到Jack Wert的精彩算法
(如情况n所述,其形式为(3 ^ k-3)/ 2,但可以推广到其他n,请参见下面的内容)
此处的较短版本和更易读的版本
对于形式为(3 ^ k-3)/ 2的n,上述解决方案完全适用,并且所需的最小称量数为k。
在其他情况下…
为所有n调整Jack Wert的算法。
为了对所有n修改上述算法,您可以尝试以下方法(不过,我没有尝试证明正确性):
首先检查n是否为(3 ^ k-3)/ 2。如果是,请应用上述算法。
如果不,
如果n = 3t(即n是3的倍数),则发现m> n最小,使得m的形式为(3 ^ k-3)/ 2。所需的称量数为k。现在形成1、3、3 ^ 2,…,3
^(k-2),Z组,其中3 ^(k-2)<Z <3 ^(k-1)并重复Jack的算法解。
注意:对于任意Z,我们还需要推广方法A(当我们知道硬币是否较轻时的情况)。
如果n = 3t + 1,则尝试求解3t(将一个球放在一边)。如果您在3吨之间找不到奇数球,那么您留下的那颗球就是有缺陷的。
如果n = 3t + 2,则形成3t +
3的组,但只有一个组没有一个球组。如果您到了必须旋转一个球组的阶段,您就会知道有缺陷的球是两个球之一,然后可以将两个球之一与已知的好球之一权衡(从另一个3吨中)
。
您将得到一个有N个节点的有根树。每个节点包含一个小写英文字母。标签为%1的节点是根。有Q个问题的形式,X,S:这里X是子树的根,S是一个字符串。 输入格式: 第一行输入由两个空格分隔的整数N和Q组成,它们分别是树中的节点数和问题数。下一行将包含N个空格分隔的小写英文字母,其中第i个字母将是存储在带有标签i的节点中的字母。接下来的n-1行中的每一行都包含两个空格分隔的整数u和v,表示在接下来的Q行后
所以...我有:int array[]={-8,2,0,5,-3,6,0,9}; 我想找到一个最小的正数(在上面的列表中是2)
问题内容: 我只需要找到1D中最小的第n个元素。 例如: 我想获得第五个最小的元素,所以我想要的输出是。 我当前的解决方案是这样的: 但是,找到5个最小的元素然后再选择最大的元素对我来说似乎很笨拙。有更好的方法吗?我是否缺少一个可以实现目标的功能? 有些问题的标题与此相似,但我没有看到任何答案。 编辑: 我本来应该提到它,但是性能对我来说很重要。因此,虽然不错的解决方案对我来说不起作用。 结果:
问题内容: 我接受了采访,并且有以下问题: 在不到O(n)的时间内从排序数组中查找唯一数字。 我给出了解决方案,但这是O(n)的。 编辑: 排序后的数组大小约为200亿,唯一数约为1000。 问题答案: 分而治之 : 查看排序序列的第一个和最后一个元素(初始序列为)。 如果两者相等,则序列中的唯一元素是第一个(无论序列有多长)。 如果不同,则划分序列并为每个子序列重复。 一般情况下解决 O(log
问题内容: 我们需要在分配中递归地找到一个数组中的第二个最小整数。但是,为了更好地理解该主题,我想先通过本网站进行迭代,然后自己进行递归。 不幸的是,迭代地进行相当混乱。我知道该解决方案很简单,但我无法解决。 到目前为止,以下是我的代码: 这适用于一些数字,但不是全部。数字会变化,因为内部if条件的效率不如外部if条件的效率。 禁止阵列重排。 问题答案: 试试这个。当最小的数字是第一个时,第二个条
问题 怎样从一个集合中获得最大或者最小的 N 个元素列表? 解决方案 heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题。 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, nums)) # Prints [42, 37, 23] p