链接:https://www.nowcoder.com/questionTerminal/5f29c72b1ae14d92b9c3fa03a037ac5f
来源:牛客网
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
示例1
输入
3 4 1 2
输出
24
解题:这个题牛客的用例应该是写错了,输入里面少一个数组大小,导致我怎么写都错,后来变成先输入数组大小的就好了。
还有就是这个题要求时间复杂度为0(n),但是平台应该也不限制用什么。这个题其实就是要求5个数组,最大,第二大,第三大,最小,第二小。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
//String[] nums = sc.nextLine().split(" ");
int n=sc.nextInt();
Long num[]=new Long[n];
for(int i=0;i<n;i++)
num[i]=sc.nextLong();
Arrays.sort(num);
System.out.println(Math.max(num[0]*num[1]*num[n-1], num[n-1]*num[n-2]*num[n-3]));
}
}
代码不足,但是平台没检测出来,或者说用例没提示我该怎么做的是:数组大小小于3怎么办?
本人代码没考虑的问题,时间复杂度O(n),这里我懒省事直接用的数组的排序函数,如果手动撸代码的时候直接弄个小顶堆,弄出来最大的3个,大顶堆弄出来最小的前两个。时间复杂度就是O(n)比那个跑5次冒泡要快很多,或者说更巧妙一些。
堆怎么用呢,有什么用途呢。下一篇再写吧!