LeetCode628:三个数的最大乘积

110 篇文章 0 订阅

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

示例 1:

输入: [1,2,3] 

输出: 6

示例 2:

输入: [1,2,3,4] 

输出: 24 

注意:
    给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
    输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。

解析:

        该题目中既有正数又有负数,所以有不同的结果。1、全部为负数,此时取最大的三个负数的乘积最大。2、全部为整数,和1中的情况一样。3、既有正数又有负数,则取三个正数的乘积和两个最小的负数和一个最大的正数乘积较大的那个。

        通过上述分析,一共有三种可能,其实三种可能可以化为一种可能,就是不管哪种情况,结果都是三个最大数的乘积和一个最大数和两个最小数乘积中较大的那个。因此该题目最重要的就是找出最大的三个数和最小的两个数。一种方法是排序,另一种方法是遍历数组,查找所需要的数字。

排序代码:

int maximumProduct(vector<int>& nums) 
{
	sort(nums.begin(), nums.end());
	int size = nums.size();
	int twoAndOne = nums[0] * nums[1] * nums[size - 1];
	int three = nums[size - 1] * nums[size - 2] * nums[size - 3];
	return twoAndOne > three ? twoAndOne : three;
	
}

参考leetcode遍历数组代码:

int maximumProduct(vector<int>& nums) 
{
        int fMax = INT_MIN, sMax = INT_MIN, tMax = INT_MIN;
        int fMin = INT_MAX, sMin = INT_MAX;
        for( auto i:nums ){
            if( i > fMax ){
                tMax = sMax;
                sMax = fMax;
                fMax = i;
            }
            else if( i > sMax ){
                tMax = sMax;
                sMax = i;
            }
            else if( i > tMax )
                tMax = i;
            if( i < fMin ){
                sMin = fMin;
                fMin = i;
            }
            else if( i < sMin )
                sMin = i;
        }
        return max( fMax*sMax*tMax, fMax*fMin*sMin );
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值