编程之美2.13 最大子阵列产品

      这个问题是目前正在寻求 n-1 最大的产品编号。该数组的大小 n。它会存在 n 一个 n-1 连续数。然后,我们需要找到一个最大的产品。

      事实上看到题目,感觉非常easy,循环走两遍数组就能够得到结果,可是,那样的话,复杂度是平方量级的,假设一个数组中元素非常多。那么,时间效率上是不能接受的。所以,须要又一次思考问题。寻找简洁的解法。

      这里。我们能够利用辅助数组的办法,把须要乘在一起的数字保存下来。单独的放到数组中,然后乘在一块就能够了。这样说起来事实上不是那么easy理解,我还是贴出代码吧,里面会有凝视。看完代码也就清晰了:

      函数声明:

/*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;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-10-12 18:16:01

编程之美2.13 最大子阵列产品的相关文章

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

问题描述: 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度. 解法: 1.暴力解法------O(n^2) 2.前后缀法------O(n) 3.统计法--------O(n) 具体思路和代码: 1.暴力解法: 思路:利用两层循环,依次删掉一个,其余的做乘法,计算出最大的. 代码: 1 int s1(int A[], int n) 2 { 3 int s = 1; 4 int max; 5 for(int i = 1;

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

      这道题目是求 n-1 个数的最大乘积,即数组大小为 n,则会存在 n 个 n-1 的连续数字,那么,我们需要寻找的是最大的那一个乘积.       其实看到题目,感觉很简单,循环走两遍数组就可以得到结果,但是,那样的话,复杂度是平方量级的,如果一个数组中元素很多,那么,时间效率上是不能接受的,所以,需要重新思考问题,寻找简洁的解法.       这里,我们可以利用辅助数组的办法,把需要乘在一起的数字保存下来,单独的放到数组中,然后乘在一块就可以了,这样说起来其实不是那么容易理解,我还

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

给定义个长度为N的整数数组,只允许用乘法,不能用除法,计算在任意(N-1)的个数的组合中乘积最大的一组. [思路] 突然变成了雅黑,挺不习惯的~~还是雅黑好看?ω? 实现起来很简单,但我是不会想到这样的思路的……看来除了积累别想着有别的途径来提高了π__π 1.用空间换时间,开数组s和t,分别保存从前向后的连乘结果和从后向前的连乘结果.对于每个排除了第i个元素的N-1个元素组合p[i], 有p[i]=s[i-1]*t[i+1],求得所有的p[i],遍历一次即可得最大值. 2.假设N个整数的乘积为

编程之美2.14 求数组的子数组之和的最大值

问题描述: 一个有N个整数元素的一维数组(A[0], A[1], A[2],...,A[n-1]),这个数组当然有很多子数组,那么子数组之和的最大值是什么呢? 解法: 1. 暴力解法-------O(N^3) 2. 改进版暴力解法-------O(N^2) *3. 分治算法-------O(NlogN)(暂时未去实现) 4. 数组间关系法-------O(N) 具体思路和代码: 1.暴力解法 思路:Sum[i,...,j]为数组第i个元素到第j个元素的和,遍历所有可能的Sum[i,...,j].

编程之美2.17 数组循环移位

问题描述: 设计一个算法,把一个含有N元素的数组循环左移或者右移K位. 解决方法: 1. 暴力解法------O(KN) 2. 颠倒位置------O(N) 具体思路和代码: 1. 暴力解法------O(KN) 思路:循环K次,每次移动一位 代码: 1 //右移 2 void s1(int A[], int n, int k) 3 { 4 k = k % n; 5 for(int i = 0; i < k; i++) 6 { 7 int t = A[n-1]; 8 for(int j = n-

编程之美leetcode之编辑距离

Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a char

编程之美2.17之数组循环移位

题目描述:设计一个算法,把一个含有N个元素的数组循环右移K位,要求算法的时间复杂度位O(Log2N),且只允许使用两个附加变量. 什么意思呢,就是说如果输入序列为:abcd1234,右移2位即变为34abcd12.唯一的要求就是使用两个附加变量. 其实这道题编程珠玑上面也出现过,书中给出的一种符合题意的解法是巧妙地进行翻转.以把abcd1234右移4位为例: 第一步:翻转1234,abcd1234---->abcd4321 第二步:翻转abcd,abcd4321---->dcba4321 第三

编程之美2.3: 寻找发帖水王

题目:传说,Tango有一大"水王",他不但喜欢发帖,还会回复其他ID发的帖子,发帖数目超过帖子总数的一半,如果你有一个当前论坛上所有帖子的列表,其中帖子作者的ID也在表中,你能快速找到这个传说中的Tango水王吗? 解题思路:由于水王的发帖数目超过一半,当每次删除两个不同ID的帖子时,水王占得帖子数目仍然大于剩下帖子的一半,重复整个过程,将ID列表中的ID总数降低,转化为更小的问题,从而得到最后水王的ID. #include <iostream> #include <

编程之美2.1 求二进制中1的个数

最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表,位运算,数组,hash表应用等等. 由于最近事情也忙得差不多了,我重新写了一遍编程之美中的算法,在这里记录下来,以便以后阅读方便. 第一道题从2.1写起,这道题目难度不是很大,首先,给出这个题目的函数声明: /*2.1 求二进制中1的个数*/ int DutCountOf1InBin_1(unsig