算法思想一:排序
解题思路:
首先将数组排序
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个变量常数级空间



京公网安备 11010502036488号