给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
示例1
输入
3 4 1 2
输出
24
思路:最大乘积=最大*次大*第三大 或者 最大*最小*次小(负负得正),因此有两种办法,1:排序后直接取,2:遍历数组直接找找出这5个数,判断哪种情况乘积最大
import java.util.Arrays;
import java.util.Scanner;
public class Pinduoduo01 {
public static void main(String args[]){//方法1,先排序最后判断 最大*次大*第三大 和 最大*最小*次小
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String line = in.nextLine();
//// int n = 61;
//// String line = "3472 -7098 -9281 7789 7955 6101 5051 7778 3090 7423 -7151 5652 1595 -8094 677 -8324 8347 -2482 9313 -9338 -3157 8559 6945 3618 3087 121 -8468 3225 1356 6939 2799 -7231 -6309 -5453 633 -8689 -4776 2714 -2743 -1409 5918 -3333 1803 8330 -2206 -6117 -4486 -7903 -4375 -3739 2897 8056 -5864 -522 7451 -4541 -2813 5790 -532 -6517 925";
String[] arrs = line.split(" ");
long[] arrays = new long[n];
for (int i=0; i<n; i++){
arrays[i] = Long.parseLong(arrs[i]);
}
Arrays.sort(arrays);
long r1 = arrays[n-1]*arrays[n-2]*arrays[n-3];
long r2 = arrays[0]*arrays[1]*arrays[n-1];
if (r1 > r2){
System.out.println(r1);
} else {
System.out.println(r2);
}
}
public static void m2(){ //方法2 直接遍历数组 找到 最大 次大 第三大 次小 最小
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String line = in.nextLine();
// int n = 61;
// String line = "3472 -7098 -9281 7789 7955 6101 5051 7778 3090 7423 -7151 5652 1595 -8094 677 -8324 8347 -2482 9313 -9338 -3157 8559 6945 3618 3087 121 -8468 3225 1356 6939 2799 -7231 -6309 -5453 633 -8689 -4776 2714 -2743 -1409 5918 -3333 1803 8330 -2206 -6117 -4486 -7903 -4375 -3739 2897 8056 -5864 -522 7451 -4541 -2813 5790 -532 -6517 925";
String[] arrs = line.split(" ");
long[] arrays = new long[n];
for (int i=0; i<n; i++){
arrays[i] = Long.parseLong(arrs[i]);
}
long max = Long.MIN_VALUE;
long second = Long.MIN_VALUE;
long third = Long.MIN_VALUE;
long min = Long.MAX_VALUE;
long secmin = Long.MAX_VALUE;
for (int i=0; i<n; i++){
if (arrays[i] > max){
third = second;
second = max;
max = arrays[i];
} else if (arrays[i] > second){
third = second;
second = arrays[i];
} else if (arrays[i] > third){
third = arrays[i];
}
if (arrays[i] < min){
secmin = min;
min = arrays[i];
} else if (arrays[i] < secmin){
secmin = arrays[i];
}
}
long r1 = max*second*third;
long r2 = max*secmin*min;
if (r1 > r2){
System.out.println(r1);
} else {
System.out.println(r2);
}
}
}

本文介绍了一种在无序数组中寻找三个数,使它们的乘积最大的算法。算法考虑了正数、负数和0的存在,通过排序或直接遍历来找出最大乘积的组合。提供了两种实现方法,包括时间复杂度为O(n)和空间复杂度为O(1)的解决方案。
1014

被折叠的 条评论
为什么被折叠?



