leetcode (Maximum Product of Three Numbers)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hsx1612727380/article/details/84578746

Title:Maximum Product of Three Numbers    605

Difficulty:Easy

原题leetcode地址:https://leetcode.com/problems/can-place-flowers/

1. 注意两个负数的乘积为正数

时间复杂度:O(n),一次一层for循环,最长遍历整个数组的长度。

空间复杂度:O(1),没有申请空间。

    /**
     * 1. 3个正数相乘,或者2个负数和一个正数相乘,最后比较他们的结果
     * @param nums
     * @return
     */
    public static int maximumProduct(int[] nums) {

        if (nums == null || nums.length < 3) {
            return 0;
        }

        int firstMaxPositive = Integer.MIN_VALUE;
        int secondMaxPositive = Integer.MIN_VALUE;
        int thirdMaxPositive = Integer.MIN_VALUE;
        int firstMinNegative = Integer.MAX_VALUE;
        int secondMinNegative = Integer.MAX_VALUE;

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > firstMaxPositive) {
                thirdMaxPositive = secondMaxPositive;
                secondMaxPositive = firstMaxPositive;
                firstMaxPositive = nums[i];
            }
            else if (nums[i] > secondMaxPositive) {
                thirdMaxPositive = secondMaxPositive;
                secondMaxPositive = nums[i];
            }
            else if (nums[i] > thirdMaxPositive) {
                thirdMaxPositive = nums[i];
            }

            if (nums[i] < firstMinNegative) {
                secondMinNegative = firstMinNegative;
                firstMinNegative = nums[i];
            }
            else if (nums[i] < secondMinNegative) {
                secondMinNegative = nums[i];
            }
        }

        return Math.max(firstMaxPositive * secondMaxPositive * thirdMaxPositive,
                firstMaxPositive * firstMinNegative * secondMinNegative);

    }

2. 先排序,在比较

时间复杂度:O(nlogn),给的是快排的时间复杂度,但是Java底层对排序的算法时取决于数组的长度。

空间复杂度:O(1),没有申请空间。

    /**
     * 先排序,后比较
     * @param nums
     * @return
     */
    public static int maximumProduct1(int[] nums) {

        if (nums == null || nums.length < 3) {
            return 0;
        }

        Arrays.sort(nums);

        return Math.max(nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3],
                nums[nums.length - 1] * nums[0] * nums[1]);

    }

猜你喜欢

转载自blog.csdn.net/hsx1612727380/article/details/84578746