算法思想一:排序

解题思路:

首先将数组排序
1、如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。
2、如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
3、综上,在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。
图解:

代码展示:

Python版本

class Solution:
    def solve(self , A ):
        # write code here
        # 数组排序
        A.sort()
        # 最大三个数的乘积
        onenums = A[-3] * A[-2] * A[-1]
        # 最小两个数乘积 与 最大数之间的乘积
        twonums = A[0] * A[1] * A[-1]
        # 返回两个数的最大值
        return max(onenums, twonums)

复杂度分析

时间复杂度:Python内置排序算法时间复杂度

空间复杂度:Python内置排序算法空间复杂度,两个变量空间O(1)

算法思想二:线性遍历

解题思路:

在方法一中,实际上只要求出数组中最大的三个数以及最小的两个数,因此可以不用排序,用线性遍历直接得出这五个数

1、定义max1、max2、max3为第一、第二、第三大的数,min1、min2为第一、第二小的数

2、遍历更新上述五个变量

3、最后返回 中最大值

注:最后需要强制转换为long类型

代码展示:

JAVA版本

import java.util.*;
public class Solution {
    /**
     * 最大乘积
     * @param A int整型一维数组 
     * @return long长整型
     */
    public long solve (int[] A) {
        // write code here
        // 最小的和第二小的
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        // 最大的、第二大的和第三大的
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
        // 顺序遍历查找最小的两个数、最大的三个数
        for(int i = 0;i < A.length;i ++){
            if(A[i] < min1){//更新最小值
                min2 = min1;
                min1 = A[i];
            }else if(A[i] < min2){//更新第二小
                min2 = A[i];
            }
            if (A[i] > max1){//更新最大值
                max3 = max2;
                max2 = max1;
                max1 = A[i];
            }else if(A[i] > max2){//更新第二大
                max3 = max2;
                max2 = A[i];
            }else if(A[i] > max3){//更新第三大
                max3 = A[i];
            }
        }
        return Math.max((long)min1 * min2 * max1,(long) max1 * max2 * max3);
    }
}

复杂度分析

时间复杂度:N为数组的长度,只需要遍历一次数组时间为

空间复杂度:仅使用5个变量常数级空间