题目:三个数的最大乘积
描述:一个整型数组 nums ,在数组中找出由三个数字组成的最大乘积,并输出这个乘积。
注意:乘积不会越界。
重点考察:线性扫描
思路:
1、如果数组中全是正数,则排序后最大的三个数相乘即为最大乘积。
2、如果数组中全是负数,则最大的三个数相乘同样也为最大乘积。
3、如果数组中既有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。(例如:[-4,-3,-2,1,4,7],最大值是 -4 * -3 * 7)
分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。
package od; import java.util.Arrays; /** * 三个数的最大乘积 * 一个整型数组 nums ,在数组中找出由三个数字组成的最大乘积,并输出这个乘积。 * 注意:乘积不会越界。 * 重点考察:线性扫描 * 原文地址:https://www.codernav.com/2819.html * 更多算法详解:https://www.codernav.com */ public class OdTest20 { public static void main(String[] args) { int num = f(new int[]{-4, -3, -2, 1, 4, 7, 9}); System.out.println(num); int num1 = f(new int[]{1, 2, 3, 4, 5, 6}); System.out.println(num1); } private static int f(int[] nums) { // 按从小到大排序 Arrays.sort(nums); int n = nums.length; // 如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积 // 如果数组中全是非正数,则最大的三个数相乘同样也为最大乘积 int num1 = nums[n - 1] * nums[n - 2] * nums[n - 3]; // 如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。 int num2 = nums[0] * nums[1] * nums[n - 1]; return Math.max(num1, num2); } }
此算法的复杂度是基于排序语句Arrays.sort(nums)的;排序的复杂度是N*logN,还是挺高的,下一篇我们用线性扫描算法降低复杂度。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...