当前位置: 首页 > 面试题库 >

其范围之和(1,2)的三元组

巫马曜文
2023-03-14
问题内容

给定n数组中的正实数,找出该集合中是否 存在 三元组,使得三元组的总和在范围内(1, 2)。在线性时间和恒定空间中进行。

  • 数组未排序。
  • 数字为正
  • 数字是 实数

任何帮助将不胜感激。谢谢。


问题答案:

诀窍是找出一种方法,对可能的解决方案进行分类,并为每个解决方案提出一个线性时间恒定空间解决方案。

考虑这三个范围X = (0,2/3), Y = [2/3,1], Z = (1,2)。最多可以有一个值Z(如果有两个值来自Z,则总和将超过1+1=2)。同样,至少一个值必须来自X。假设有3个值,a <= b <= c因此1 <= a+b+c <= 2。然后,考虑哪些可行的解决方案类别是可行的:

A) `a \in X, b \in X, C \in X` 
B) `a \in X, b \in X, C \in Y` 
C) `a \in X, b \in X, C \in Z` 
D) `a \in X, b \in Y, C \in Y` 
E) `a \in X, b \in Y, C \in Z`

那么我们如何测试每种情况?

案例A非常容易测试:保证总和小于2,因此我们只需要测试最大和(X中最大的3个元素)超过1。

情况C非常容易测试:由于保证了总和大于1,我们只需要检查总和是否小于2。因此,为了做到这一点,我们只需要测试X中的最小2个值即可。 Z的最小值

情况D和E与C相似(因为总和必须至少为4/3> 1,因此请在每个类别中选择最小的值)。

情况B是唯一棘手的情况。 0 < a+b < 4/32/3 <= c <= 1。为了处理情况B,我们考虑以下间隔:X1 =(0,1/2),X2 =
[1/2 2/3),Y = [2/3,1]。

这导致以下三个有效情况:

B1。X1中的a,X2中的b,Y中的c

B2。X1中的a,X1中的b,Y中的c

B3。X2中的a,X2中的b,Y中的c

情况B1和B3:三个数字的总和始终大于1,因此我们取最小值,然后检查其是否小于2。

情况B2:三个数字的总和总是小于2,因此我们取最大和并检查是否大于1。

综上所述,测试是:

  • |X| >= 3Xmax(1) + Xmax(2) + Xmax(3) >= 1
  • |X| >= 2|Z| >= 1Xmin(1)+Xmin(2)+Zmin(1) <= 2
  • |X| >= 1|Y| >= 2Xmin(1)+Ymin(1)+Ymin(2) <= 2
  • |X| >= 1|Y| >= 1|Z| >= 1,和Xmin(1)+Ymin(1)+Zmin(1) <= 2
  • |X| >= 2|Y| >= 1Xmax(1) + Xmax(2) + Ymin(1) < 2
  • |X| >= 2|Y| >= 1Xmin(1) + Xmin(2) + Ymax(1) > 1

每个测试都可以在线性时间和恒定空间中进行(您只需要查找Xmax(1), Xmax(2), Xmax(3), Xmin(1), Xmin(2), Ymin(1), Ymin(2), Ymax(1), Zmin(1),即使没有对数据进行排序,也可以一次找到所有这些)



 类似资料:
  • 问题内容: 我想查询日期范围内的elasticsearch文档。我现在有两个选择,两个都适合我。已经测试了他们两个。1.范围查询2.范围过滤器 由于我现在的数据集很小,因此无法测试它们的性能。两者有什么区别?哪个会导致更快地检索文档和更快地响应? 问题答案: 查询和过滤器之间的主要区别在于评分。查询将返回每个文档具有相对排名得分的文档。过滤器没有。这种差异使过滤器更快,有两个原因。首先,它不会产生

  • 我想查询日期范围内的elasticsearch文档。我现在有两个选择,都很适合我。我已经测试了他们两个。1.范围查询2。距离滤波器 因为我现在有一个小数据集,所以无法测试它们的性能。这两者有什么区别?哪一种方法可以更快地检索文档和响应?

  • 我正在与JSoup合作,以下是我的代码: 这是页面: 我想得到以下元素的值: itemPrice,_18gRm, itemtitle,_2FRXm 谢谢大家。

  • 问题内容: 我阅读了有关sessionStorage和localStorage的一些文档,但是我不明白范围是什么:域,特定页面? 并且如果在上述每个页面上运行(idvalue是查询字符串中的值): 我最终会存储3个不同的值,还是两个值会互相覆盖? 问题答案: 这些值将互相覆盖。每个密钥名称对对于协议和域而言都是唯一的,而与路径无关。 可以通过属性更改受影响的域。 -> 可以(子域) -> 不可能

  • 问题内容: 我设置了一个范围滑块,范围为0-2hr,时间以分钟为单位计算,然后像这样转换为hh:mm:10min,20min,1hr 20min,2hr。 但是现在我正在尝试使用范围滑块指定的范围来过滤一堆项目,而我很难做到这一点。 这是我所做的http://cdpn.io/LDusa 我正在使用http://danielcrisp.github.io/angular- rangeslider/d

  • 在方括号 […] 中的几个字符或者字符类意味着“搜索给定的字符中的任意一个”。 集合 比如说,[eao] 意味着查找在 3 个字符 'a'、'e' 或者 `‘o’ 中的任意一个。 这被叫做一个集合。集合可以在正则表达式中和其它常规字符一起使用。 // 查找 [t 或者 m],然后再匹配 “op” alert( "Mop top".match(/[tm]op/gi) ); // "Mop", "to

  • 问题内容: 我在书中看到了一段代码,内容如下: 范围和块都一样吗? 问题答案: 作用域是您可以引用变量的地方。块定义了一个变量,该变量在一个块内部定义,将仅在该块内部定义,并且在块结束后不能引用它。 因此,在这段代码中,如果您尝试执行以下操作: 因为这里拥有的是局部作用域 ,所以java中的其他种类的作用域都是(例如),所以类的成员具有类作用域,因此可以在类内部的任何地方访问它。 范围的基本规则是

  • 问题内容: 我有一个元组列表,每个元组都是一个。我正在尝试合并所有重叠的时间范围,并返回不同时间范围的列表。例如 这是我的实现方法。 我想弄清楚是否 是某些python模块中的内置函数可以更有效地做到这一点吗?要么 有没有达到相同目标的更Python方式? 感谢您的帮助。谢谢! 问题答案: 使用Pythonic可以提高效率的几种方法: 消除了构造,因为该算法应在主循环中删除重复项。 如果只需要遍历