这是我参与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)