在Java中查找负数的最大乘积

时间:2014-06-10 15:42:27

标签: java algorithm

我正在学习Java的半高级课程。我自学了JavaScript作为一种爱好,所以我不是一个真正的初学者,但在制作算法时我并不是很有经验。我们有一个家庭作业问题要做。它遵循以下方式:给定 n 正整数,其中 n&gt; = 5 通过选择两个(不一定是连续的)数字作为因子来找到最大的产品。< / p>

例如,如果输入为:3 6 0 10 4,则输出应为60

这看起来相当容易。我只挑选了最大的两个并乘以它们:

System.out.println("How many numbers will you give me?");
int n = sc.nextInt();
if (n < 5) throw new Error("n must be at least 5");
System.out.println("Enter the numbers");
int max1 = 0, max2 = 0;
for (int i = 0; i < n; ++i) {
    int newInt = sc.nextInt();
    if (newInt > max1) {
        max2 = max1;
        max1 = newInt;
    } else if (newInt > max2) {
        max2 = newInt;
    }
}
System.out.println("The largest product is " + (max1 * max2));

这完美无缺。现在,有一个&#34;奖金&#34;或者在此之后延长问题(可选)。我决定尝试一下。问题类似:给定 n (不一定是正数)整数,通过选择两个(不一定是连续的)数字作为因子来找到最大的产品。假设 5&lt; = n&lt; = 25

,程序应在合理的时间内运行

旧程序的问题是它会因-6 -5 3 0 4之类的输入而失败。如果正确答案为12,则会输出30。我决定检查绝对值而不是实际值,因此将包括负数。该代码类似于:

System.out.println("How many numbers will you give me?");
int n = sc.nextInt();
if (n < 5) throw new Error("n must be at least 5");
System.out.println("Enter the numbers");
int max1 = 0, max2 = 0;
for (int i = 0; i < n; ++i) {
    int newInt = sc.nextInt(), absValue = Math.abs(newInt);
    if (absValue > Math.abs(max1)) {
        max2 = max1;
        max1 = newInt;
    } else if (absValue > Math.abs(max2)) {
        max2 = newInt;
    }
}
System.out.println("The largest product is " + (max1 * max2));

这适用于-6 -5 3 0 4,正确提供30-6 -3 1 5 4失败。它给出了-30的答案,这显然是不正确的。

我尝试了一个强力解决方案(检查每个可能的产品),它对n = 5非常有效但需要n!次迭代,这意味着n = 25需要很长时间。 我对如何解决这个问题感到难过。先感谢您。

2 个答案:

答案 0 :(得分:10)

问题是检查绝对值会丢弃它们可能为负数的信息。你需要两个正数或两个负数。

实现这一目标的最简单方法是扫描,找到最小的两个和最大的两个数字。

多个最小的两个。乘以两个最大的。无论哪个更大都是你的结果。

答案 1 :(得分:1)

保存在数组(a)中,对数组进行排序,然后返回max(a[0]*a[1], a[a.length-1]*a[a.length-2])