刷题的时候做了一道笔试题,题目是从一个无序数组中找出乘积最大的三个数,但是要求时间复杂度:O(n),空间复杂度:O(1) 。开始一直想着用two pointer的思路去做,结果越陷越深,完全找不到思路,后来看了别人的博客才发现这道题非常的简单,只要把集中情况考虑分析一下就能写出来:
为了找乘积最大的三个数,考虑以下情况:
1. 所有数>=0的情况,这时只需要找最大的3个数就行了
2. 所有数<=0,这时还是只需要找最大的3个数就行了
3. 序列既包含>0和<0的数,要求最大的数肯定得是正数,所以要么是三个正数,要么是两负一正,所以最大的正数肯定要在里面,然后比较最小的两个负数和第二第三大的两个正数比较哪个乘积最大即可。
所以写代码时只需要一遍迭代,找出最大的三个数和最小的两个数并根据这几种情况作比较即可。
代码如下:
public class MaximumProduct {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int len=in.nextInt();
int numbers[]=new int [len];
for (int i=0;i<len;i++) numbers[i]=in.nextInt();
int output=maximumProduct(numbers);
System.out.println(output);
}
public static int maximumProdu