LeetCode.628 三个数的最大乘积

249 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

题目描述:

628. 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)

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

示例一

输入: nums = [1,2,3]
输出: 6

示例二

输入: nums = [1,2,3,4]
输出: 24

示例三

输入: nums = [-1,-2,-3]
输出: -6

提示:

  • 3 <= nums.length <= 10^4
  • -1000 <= nums[i] <= 1000

思路分析

排序

这个主要要注意正负的问题,如果全是正数,那么最大值就是最大的3个数的乘积。

如果有正有负,那肯定要2个负数,凑个负负得正,然后再乘以最大的正数,两个负数也肯定为最小的两个负数(要绝对值最大)。

综上所述,我们的答案即为上面的两种情况二选一。

AC代码

class Solution {
    fun maximumProduct(nums: IntArray): Int {
        nums.sortDescending()
        var size = nums.size
        var x = nums[0] * nums[1] * nums[2]
        var y = nums[0] * nums[size -1] * nums[size -2]
        return Math.max(x, y)
    }
}

总结

简单的数学题,优化的话,还是基于上面那个思路,我们发现,我们最终只用到了其中5个数来求得答案。即最大的3个正数,最小的2个负数,有这个五个数我们就可以得到答案,所以我们没必要去排序了,只要找到合适的算法找到这5个数即可。可以参考一下 628. 三个数的最大乘积 - 模拟 - 排序 - 三个数的最大乘积

参考

三个数的最大乘积 - 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)

思路 - 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)

628. 三个数的最大乘积 - 模拟 - 排序 - 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)

图解贪心证明+三数排序实现 O(n) 时间 - 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)