6.28 三个数的最大乘积
给你一个整型数组 nums
,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
提示:
3 <= nums.length <= 104
-1000 <= nums[i] <= 1000
首先,我想到的是,用冒泡排序,把它排序出来,然后再进行计算。
1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换它们的位置
2. 每一次比较,都会产生出一个最大,或者最小的数字
3. 下一轮则可以少一次排序
4. 依次循环,直到结束
三种情况:
1.全是正数
2.全是负数
3.有正有负
情况1,取最后3个数为最大乘积
情况2,取最后3个数为最大乘积
情况3,取前两个负数与数组最后一个正数的乘积为最大乘积,或者是取最后3个数为最大乘积
综上所诉,取最后3个数为最大乘积,或者是取前2负数与最后一个正数的乘积
class Solution {
public int maximumProduct(int[] nums) {
int max;
int t;
int n=nums.length;
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++)
if(nums[j]>nums[j+1])
{
t=nums[j];
nums[j]=nums[j+1];
nums[j+1]=t;
}
}
return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
}
}
但是的话,由于冒泡排序繁杂,其性能还是不友好的。用时大概1586ms
JAVA API中提供了一个工具类Arrays供我们使用,它可以让我们操作数组更快,更简便,实际上,它的底层,也是类似于冒泡排序的写法的,其中Arrays.sort(),就是我们今天的主角,默认是升序排序的。
class Solution {
public int maximumProduct(int[] nums) {
int n=nums.length;
Arrays.sort(nums);
return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
}
}
是不是很懵,怎么这么的简短,没错,它就是这么的厉害。用时12ms.
实际上,上面的排序算法是不安全的,后面我们在说。
算法的目的就是解决问题,但是如果一个程序跑了很久,它就是一个垃圾算法,所以算法的解决问题的速度尤其重要。