编程之美2.13 子数组的最大乘积

      这道题目是求 n-1 个数的最大乘积,即数组大小为 n,则会存在 n 个 n-1 的连续数字,那么,我们需要寻找的是最大的那一个乘积。

      其实看到题目,感觉很简单,循环走两遍数组就可以得到结果,但是,那样的话,复杂度是平方量级的,如果一个数组中元素很多,那么,时间效率上是不能接受的,所以,需要重新思考问题,寻找简洁的解法。

      这里,我们可以利用辅助数组的办法,把需要乘在一起的数字保存下来,单独的放到数组中,然后乘在一块就可以了,这样说起来其实不是那么容易理解,我还是贴出代码吧,里面会有注释,看完代码也就清晰了:

      函数声明:

/*2.13 子数组的最大乘积*/
ll DutMaxMultipleInArray(int*, int);

      源代码:

/*任意n - 1个数的组合中乘积最大的一组*/
bool _DutMaxMultipleInArray = false;
ll DutMaxMultipleInArray(int* A, int size)
{
	if (!A || size <= 0)
	{
		_DutMaxMultipleInArray = true;

		return -1;
	}

	/*两个辅助数组,数组元素存储1 -- n - 1个数的乘积*/
	ll* s = new ll[size];
	ll* t = new ll[size];

	ll maxValue = 1 << 31;

	s[0] = 1;
	t[size - 1] = 1;

	for (int i = 1; i < size; ++i)
		s[i] = A[i - 1] * s[i - 1];

	for (int j = size - 2; j >= 0; --j)
		t[j] = A[j + 1] * t[j + 1];

	ll* p = new ll[size];

	for (int k = 0; k < size; ++k)
	{
		/*循环走一遍数组元素就可以得到n - 1个数组元素乘积的所有组合*/
		p[k] = s[k] * t[k];

		/*每次比较最大值选择最大即可*/
		if (p[k] > maxValue)
			maxValue = p[k];
	}

	return maxValue;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值