任意3个数字的最大乘积

Maximum product of any 3 numbers

本文关键字:3个 数字 任意      更新时间:2023-10-16

给定o文件中的n个数字,计算任意三个数字的最大乘积。不接受使用矢量或数组。文件中的数字(int)可以是负-正,甚至可以是零。

解决这个问题最简单的方法是什么?我在想一些可能的情况:当所有的数字都是正、负、零,但还有更多的情况,比如当有正和负在一起时,

我假设输入集至少包含4个整数(如果我们有3个整数,则解决方案是琐碎的…)

有几个案例值得关注:

  1. 2个或多个负整数,1个或2个正整数
  2. 2个或更多负整数,3个或更多正整数
  3. 所有正整数
  4. 1个负整数,3个或更多正整数
  5. 所有负整数

让我们考虑一下每种情况下的解决方案。在下面的讨论中,lowestgreatest都指整数上的公共总序:例如,在-5和-1中,-1是最大的。

  1. 通过将具有最高绝对值的2个负数(即它们的分钟数)与最高正数相乘,可以获得所需的输出。换句话说,结果是lowest_negative*2nd_lowest_negative*greatest_positive
  2. 结果为max(3rd_greatest_positive*2nd_greatest_positive, lowest_negative*2nd_lowest_negative)*greatest_positive
  3. 结果为3rd_greatest_positive*2nd_greatest_positive*greatest_positive
  4. 与3相同
  5. 结果为3rd_greatest_negative*2nd_greatest_negative*greatest_negative

从上面的例子中,你可以推导出一个普遍解决问题的公式(适用于3元素集以及负/正整数的任何配置):

result = max(max1*min1*min2, max1*max2*max3)

其中,max1是输入的最大值,max2是第二大元素,max3是第三大元素,并且min1min2是最低的两个元素。

现在,您可以很容易地编写一个程序来跟踪2个最小元素和3个最大元素(不管它们的符号如何!),然后返回max(max1*min1*min2, max1*max2*max3)

这里有一个C++演示(使用向量),只是为了演示公式的准确性。我把I/O处理留给你做练习。

这是一个相当数学化的问题。

在不试图证明的情况下,我的想法是取绝对值最大的数字,同时寻找偶数的负数来产生正数。

可以有负数和正数,也可以发生所有数字都是负数的情况,因此您必须考虑所有可能的情况:

最大的产品可以由。。。

+++   all numbers positive  -> needs factors with large absolute value
++-   one negative          -> needs factors with small absolute value
+--   only one positive     -> needs factors with big ...
---   all negative          -> needs factors with small ...

由于你不能使用数组或矢量,你可以这样做:

对于上述每种情况,您需要具有最大绝对值或最小绝对值的所有因素。你可以浏览所有给定的数字,并为每个案例存储三个数字,这三个数字将成为本案例中最大的产品。最后,你只需要比较4个结果,然后取最大的一个。

解决这个问题最简单的方法是什么?

野蛮的力量。

计算N中3个数字的所有乘积,选择3个时间,然后取最大值。

你的投入有多大?您可以使用记忆(动态编程)方法重用2个数字的乘积。

找到两个最大的数字和两个最小的数字,还有一个第三大的数字,如果第三个数字是正数,则返回它和具有最大乘积的对,如果是负数,则返回其和具有最小乘积的对。