628. 三个数的最大乘积

题目描述

思路:

去掉数组中只有3个数的特殊情况。如果数组只有3个数,直接将这三个数的乘积输出。
去除特殊情况之后,我最开始的想法是对数组进行排序,然后如果负数的个数少于等于1个,输出最大的三个数的乘积;如果负数的个数大于等于2个,比较最小的两个负数与最大的数的乘积最大的3个数的乘积的大小,输出大的那个。代码如下:

import java.util.Arrays;

class Solution {
    public int maximumProduct(int[] nums) {
        int res = 1;
        int length = nums.length;

        if (length == 3) {
            res = nums[0] * nums[1] * nums[2];
        } else {
            Arrays.sort(nums);
            if (nums[0] >= 0 || (nums[0] < 0 && nums[1] >= 0)) {
                res = nums[length - 1] * nums[length - 2] * nums[length - 3];
            } else {
                int temp1 = nums[0] * nums[1] * nums[length - 1];
                int temp2 = nums[length - 1] * nums[length - 2] * nums[length - 3];
                res = temp1 > temp2 ? temp1 : temp2;
            }
        }
        return res;
    }
}

执行用时: 14 ms(超过9.084%)
内存消耗: 40.3 MB

效果不好,细想一下,反正也只需要最小的两个数和最大的三个数。那么可以对数组遍历5次,找出这5个数就好了。
那么又有一个问题,如果数组中元素个数少于5个?我也懒得考虑太多的情况。于是对之前的代码进行复用,当数组元素个数较少时使用之前的方法。最终的代码如下:

import java.util.Arrays;

class Solution {
    public int maximumProduct(int[] nums) {
        int res = 1;
        int length = nums.length;

        if (length == 3) {
            res = nums[0] * nums[1] * nums[2];
        } else if (length <= 32) {
            Arrays.sort(nums);
            if (nums[0] >= 0 || (nums[0] < 0 && nums[1] >= 0)) {
                res = nums[length - 1] * nums[length - 2] * nums[length - 3];
            } else {
                int temp1 = nums[0] * nums[1] * nums[length - 1];
                int temp2 = nums[length - 1] * nums[length - 2] * nums[length - 3];
                res = temp1 > temp2 ? temp1 : temp2;
            }
        } else {
            int temp = 0;
            int count = 0;
            while (count < 5) {
                if (count % 2 == 0) {
                    // find the max
                    for (int i = 0; i < length - 1; i++) {
                        if (nums[i] > nums[i + 1]) {
                            temp = nums[i];
                            nums[i] = nums[i + 1];
                            nums[i + 1] = temp;
                        }
                    }
                } else {
                    // find the min
                    for (int j = length - 2; j >= 0; j--) {
                        if (nums[j] > nums[j + 1]) {
                            temp = nums[j];
                            nums[j] = nums[j + 1];
                            nums[j + 1] = temp;
                        }
                    }
                }
                count++;
            }
            int temp1 = nums[0] * nums[1] * nums[length - 1];
            int temp2 = nums[length - 1] * nums[length - 2] * nums[length - 3];
            res = temp1 > temp2 ? temp1 : temp2;
        }
        return res;
    }
}

执行用时: 4 ms(超过74.109%)
内存消耗: 40 MB

还行,思路也跟官方题解一样。

你可能感兴趣的:(628. 三个数的最大乘积)