LeetCode第二天(628. 三个数的最大乘积)

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

我的答案:(只通过了63个用例,没考虑到两个负数相乘得正的情况)

class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        reverse(nums);
        return nums[0] * nums[1] * nums[2];

    }

     public void reverse(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }
    }
}

看了题解改的答案:

class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        reverse(nums);
        int n = nums.length;
        return Math.max(nums[0] * nums[1] * nums[2],nums[0] * nums[n-1] * nums[n-2]);

    }

     public void reverse(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }
    }
}

官解:

方法一:排序
首先将数组排序。

如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。

如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。

综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。

class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
    }
}
方法二:线性扫描(速度最快)

在方法一中,我们实际上只要求出数组中最大的三个数以及最小的两个数,因此我们可以不用排序,用线性扫描直接得出这五个数。

class Solution {
    public int maximumProduct(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);
    }
}

相关推荐

  1. LeetCode第二628. 乘积

    2024-03-25 03:26:02       45 阅读
  2. LeetCode第一(414.第

    2024-03-25 03:26:02       45 阅读
  3. 算法笔记(模拟乘积问题)

    2024-03-25 03:26:02       59 阅读
  4. Leetcode 152. 乘积组和Leetcode 162. 寻找峰值

    2024-03-25 03:26:02       43 阅读
  5. LeetCode-152. 乘积子数组

    2024-03-25 03:26:02       73 阅读
  6. leetcode 152.乘积子数组

    2024-03-25 03:26:02       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 03:26:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 03:26:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 03:26:02       87 阅读
  4. Python语言-面向对象

    2024-03-25 03:26:02       96 阅读

热门阅读

  1. 设计模式之观察者模式

    2024-03-25 03:26:02       49 阅读
  2. C++异常处理

    2024-03-25 03:26:02       45 阅读
  3. c++统计字符出现次数

    2024-03-25 03:26:02       39 阅读
  4. 字母在字符串中的百分比

    2024-03-25 03:26:02       42 阅读
  5. LeetCode的使用方法

    2024-03-25 03:26:02       41 阅读
  6. Vue修饰符总结

    2024-03-25 03:26:02       39 阅读
  7. AcWing 3417.砝码称重

    2024-03-25 03:26:02       45 阅读
  8. qinakun实现公共依赖的加载

    2024-03-25 03:26:02       50 阅读
  9. Git tag总结

    2024-03-25 03:26:02       39 阅读
  10. vscode集成git管理项目

    2024-03-25 03:26:02       37 阅读