https://www.lanqiao.cn/problems/315/learning/
题目描述
实现一个算法在数组中找到 3 个数字的最大乘积。介绍如下:
例如数组 [5, -2, 3, 1, -1, 4] 中 3 个数字的最大乘积为 60。
输入描述
第一行为数字 N((3≤N≤1000),表示数组元素的个数。
第二行为数组元素 Ai −1000≤Ai ≤1000
输出描述
输出一行,为 3 个数字的最大乘积。
输入输出样例
示例
输入
6
5 -2 3 1 -1 4
输出
60
如果用暴力3重循环会超时1000*1000*1000=10的9次方,而一般10的8次方:
import java.util.Scanner;
public class Main {
static int a[]=new int[1010];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++) {
a[i]=sc.nextInt();
}
//有负数不要初始给0
int ans=(int)-1e9;
for(int i=0;i<n;i++) {
for(int j=i+1;j<n;j++) {
for(int k=j+1;k<n;k++) {
ans=Math.max(ans, a[i]*a[j]*a[k]);
}
}
}
System.out.println(ans);
}
}
使用排序,如果都是正数排序后取最后三个即可,如果有负数可能取开始两个负数和最后一个数
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<n;i++) {
list.add(sc.nextInt());
}
//排序一般内部快排nlogn 最多1e5 而现在最多1000个数 不超时
Collections.sort(list);
int ans=list.get(n-1)*list.get(n-2)*list.get(n-3);
ans=Math.max(ans, list.get(0)*list.get(1)*list.get(n-1));
System.out.println(ans);
}
}