题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
示例1
输入
3 4 1 2
输出
24
解题的思路
切记不能排序:因为时间复杂度:O(n),空间复杂度:O(1)
-
数组全部是正数,最大三个数的乘积
-
数组全部是负数,最大三个数的乘积
-
数组有正有负,最大的一个数和最小的两个数的乘积
所以一共需要计算五个值:数组中最大的三个值和最小的两个值
比较最大三个数的乘积和最大一个数与最小两个数的乘积。
因为题目要求时间复杂度为O(1),故不能先排序。
所以需要在遍历的同时找出这五个数。
我们看看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
//输入技巧:先用String类型获取键盘输入字符的长度,并将输入的String 类型转换为int类型,存入int型数组里面
Scanner input = new Scanner(System.in);
int n = Integer.parseInt(input.nextLine());
String[] str = input.nextLine().split(" ");
int[] arr = new int[str.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(str[i]);
}
getMax(arr);
}
public static void getMax(int[] arr) {
//定义五个数:
int max = 1, second_max = 1, third_max = 1;//最大的十个数
int min = 1, second_min = 1;//最小的两个数(有正数有负数的情况下)
for (int i = 0; i < arr.length; i++) {
if (max < arr[i]) {
third_max = second_max;
second_max = max;
max = arr[i];
} else if (second_max < arr[i]) {
third_max = second_max;
second_max = arr[i];
} else if (third_max < arr[i]) {
third_max = arr[i];
} else if (arr[i] < min) {
second_min = min;
min = arr[i];
} else if (arr[i] < second_min) {
second_min = arr[i];
}
}
long max1 = (long) max * second_max * third_max;//三个最大的情况
long max2 = (long) max * second_min * min;//一个大的两个小
if (max1 >= max2) {
System.out.println("max:"+max+" second_max:"+second_max+" third_max:"+third_max+" result:"+max1);
} else {
System.out.println("max:"+max+" second_min:"+second_min+" min:"+min+" result:"+max2);
}
}
}