博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Maximum Product of Three Numbers 三个数字的最大乘积
阅读量:5858 次
发布时间:2019-06-19

本文共 1796 字,大约阅读时间需要 5 分钟。

 

Given an integer array, find three numbers whose product is maximum and output the maximum product.

Example 1:

Input: [1,2,3]Output: 6

 

Example 2:

Input: [1,2,3,4]Output: 24

 

Note:

  1. The length of the given array will be in range [3,104] and all elements are in the range [-1000, 1000].
  2. Multiplication of any three numbers in the input won't exceed the range of 32-bit signed integer.

 

这道题博主刚开始看的时候,心想直接排序,然后最后三个数字相乘不就完了,心想不会这么Easy吧,果然被OJ无情打脸,没有考虑到负数和0的情况。这道题给了数组的范围,至少三个,那么如果是三个的话,就无所谓了,直接相乘返回即可,但是如果超过了3个,而且有负数存在的话,情况就可能不一样,我们来考虑几种情况,如果全是负数,三个负数相乘还是负数,为了让负数最大,那么其绝对值就该最小,而负数排序后绝对值小的都在末尾,所以是末尾三个数字相乘,这个跟全是正数的情况一样。那么重点在于前半段是负数,后半段是正数,那么最好的情况肯定是两个最小的负数相乘得到一个正数,然后跟一个最大的正数相乘,这样得到的肯定是最大的数,所以我们让前两个数相乘,再和数组的最后一个数字相乘,就可以得到这种情况下的最大的乘积。实际上我们并不用分情况讨论数组的正负,只要把这两种情况的乘积都算出来,比较二者取较大值,就能涵盖所有的情况,从而得到正确的结果,参见代码如下:

 

class Solution {public:    int maximumProduct(vector
& nums) { int n = nums.size(); sort(nums.begin(), nums.end()); int p = nums[0] * nums[1] * nums[n - 1]; return max(p, nums[n - 1] * nums[n - 2] * nums[n - 3]); }};

 

下面这种方法由网友hello_world00提供,找出3个最大的数 || 找出一个最大的和两个最小的,相乘对比也能得到结果,而且是O(n)的时间复杂度,参见代码如下:

 

解法二:

class Solution {public:    int maximumProduct(vector
& nums) { int mx1 = INT_MIN, mx2 = INT_MIN, mx3 = INT_MIN; int mn1 = INT_MAX, mn2 = INT_MAX; for (int num : nums) { if (num > mx1) { mx3 = mx2; mx2 = mx1; mx1 = num; } else if (num > mx2) { mx3 = mx2; mx2 = num; } else if (num > mx3) { mx3 = num; } if (num < mn1) { mn2 = mn1; mn1 = num; } else if (num < mn2) { mn2 = num; } } return max(mx1 * mx2 * mx3, mx1 * mn1 * mn2); }};

 

参考资料:

 

转载地址:http://toojx.baihongyu.com/

你可能感兴趣的文章
HDU 5147 Sequence II ( 树状数组 )
查看>>
POJ 2528 Mayor's posters(线段树,区间覆盖,单点查询)
查看>>
不用写代码的框架 - RobotFramework+Eclispe环境安装篇
查看>>
【转】删除已经存在的 TFS Workspace
查看>>
原生JS实现全屏切换以及导航栏滑动隐藏及显示——修改
查看>>
pku 1811 Prime Test 大素数判定和大数分解
查看>>
Oracle 数据备份与恢复
查看>>
转载 -- extern"C" 的用法解析
查看>>
bzoj 3196 Tyvj 1730 二逼平衡树
查看>>
JavaScript中OnLoad几种使用方法
查看>>
算法20-----卡诺兰数
查看>>
在windowsxp系统内删除linux系统分区后出现grub error 22系统无法启动的解决办法
查看>>
用C# 实现 Zen Cart 的用户密码加密算法
查看>>
文件上传——servlet实现
查看>>
学习笔记之集合ArrayList(1)和迭代器
查看>>
五十 常用第三方模块 PIL
查看>>
15 Java常用API之二
查看>>
设计模式学习笔记——State状态模式
查看>>
android 自定义dialog的实现方法
查看>>
Ubuntu关闭进入screensaver模式
查看>>