算法 三个数的最大乘积(线性扫描)

前言

题目链接

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

示例 1:

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

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

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


一、思路分析

  • 如果数组中全是非负数,则排序后最大的三个数相乘,即为最大乘积;
  • 如果全是非正数,则最大的三个数相乘,同样也为最大乘积;
  • 如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对
    值最大)与最大正数的乘积。

解题关键:分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答
案。


二、解题代码

2.1 排序法

// 排序法
int maximumProduct(int* nums, int numsSize){
	//排序,此处用伪代码替代

	long max = ((nums[numsSize-1] * nums[numsSize-2] * nums[numsSize-3]) > (nums[0] * nums[1] * nums[numsSize-1])) 
	               ? (nums[numsSize-1] * nums[numsSize-2] * nums[numsSize-3])
	               : (nums[0] * nums[1] * nums[numsSize-1]);
	return max;
}

2.2 线性扫描法

注意:对数组的取数,不能重复取一个索引。

//线性扫描法
int maximumProduct(int* nums, int numsSize){
	int bit_nums = sizeof(int) * 8;
	
	int MAX = (long)pow(2, bit_nums-1) - 1; 
	int MIN = -((long)MAX + 1);

	int min1 = MAX, min2 = MAX;  // min1 是最小, min2 是次最小
	int max1 = MIN, max2 = MIN, max3 = MIN; // max1 是最大,max2 是次最大,max3 是次次最大

	for (int i = 0; i < numsSize; i++)
	{
		int x = nums[i];
		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 ((max3 * max2 * max1) > (min2 * min1 * max1))
	               ? (max3 * max2 * max1)
	               : (min2 * min1 * max1);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值