前言:
欢迎阅读LeetCode每日一题系列,这个系列将会以每日一道算法题的形式,给大家带来详细的LeetCode算法题的解题思路和编写过程,带你一路过关斩将,拿下这些看似难懂的算法题!今天给大家分享的是三个数的最大乘积!废话不多说,先上题目!
1.1 题目要求
题目类型:三个数的最大乘积
题目内容:整型数组nums,在数组中找出由三个数字组成的最大乘积,并输出这个乘积
注意事项:乘积不会越界
重点考查:线性扫描
1.2 解题方法
怎么样?看完了题目,是不是感觉一头雾水;没关系,看一看解题思路,相信你会有所启发!
1.2.1 解题思路
例如一个整型数组元素为:[1, 2, 3, 4 ] ,那么最大乘积就是 2 * 3 * 4 = 24
- 若整型数组的元素都为整数,那么只需要求出三个大数的乘积,即为最大乘积;
注意:这里三个大数是指在整型数组的中绝对值排在前三的元素
- 若整型数组的元素都为负数,那么仍然需要求出三个大数的乘积
注意:由于三个负数相乘,其结果仍为负数,负数的绝对值越大,其实际值越小,因此这里三个大数是指在整型数组的中绝对值排在倒数三位的元素
例如整型数组 nums的元素为:[-4, -3, -2, -1],求三个数的最大乘积时,选取的乘数是-3, -2, -1,而不是 -4, -3, -2
- 若整型数组的元素有正有负时,则需要在负数中选择两个小数(即绝对值排在前两个的元素), 在正数中选择一个最大数;
因此可以分为两种情况:
- 第一种情况:数组元素全为正数或者负数, 选取数组中排前三的元素,三者求乘积
- 第二种情况:数组元素有正有负,选取数组中的负数绝对值排前二的元素, 正数中最大元素,三者求乘积
1.2.2 代码实现
1.使用快速排序查找
这里我们使用JDK1.8 API中提供的数组工具类提供的排序方法,即双轴快速排序算法
package java.util;
public class Arrays {
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}
}
package com.kuang.leetcode6;
import java.util.Arrays;
public class MaxProduct {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6};
int[] arr2 = {-6,-5,-4,-3,-2,-1};
int[] arr3 = {-6,5,-4,3,-2,1};
System.out.println("使用快速排序算法:");
System.out.println(sort(arr1));
System.out.println(sort(arr2));
System.out.println(sort(arr3));
}
public static int sort(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
return Math.max(nums[0] * nums[1] * nums[n-1], nums[n-1] * nums[n-2] * nums[n-3]);
}
}
结果:测试结果与预期结果相同!
2.使用线性扫描查找
package com.kuang.leetcode6;
import java.util.Arrays;
public class MaxProduct {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6};
int[] arr2 = {-6,-5,-4,-3,-2,-1};
int[] arr3 = {-6,5,-4,3,-2,1};
System.out.println("使用线性扫描算法:");
System.out.println(getMaxMin(arr1));
System.out.println(getMaxMin(arr2));
System.out.println(getMaxMin(arr3));
}
public static int getMaxMin(int[] nums) {
int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
for (int x : nums) {
if(x < min1) {
min2 = min1;
min1 = x;
} else if(x < min2) {
min2 = x;
}
if(x > max1) {
max3 = max2;
max2 = max1;
max1 = x;
} else if( x > max2) {
max3 = max2;
max2 = x;
} else if( x > max3) {
max3 = x;
}
}
return Math.max(min1 * min2 * max1, max1 * max2 * max3);
}
结果:测试结果与预期结果相同!
好了,今天LeetCode每日一题—三个数的最大乘积到这里就结束了,欢迎大家学习和讨论,点赞和收藏!
参考视频链接:https://www.bilibili.com/video/BV1Ey4y1x7J3 (国内算法宝典-LeetCode算法50讲)
|