leetcode :Find the contiguous subarray within an array (containing at least one number) which has th

题目:

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.

整理后为:

答案:

int maxProduct(int A[], int n)
{
	if (n == 1)
		return A[0];
	int max = INT_MIN;
	int negative_num = 0;
	int negative_first = 1;
	int negative = 1;
	int all = 1;
	bool positive_after_negative = false;
	for (int i = 0; i < n; i++)
	{
		if (A[i] != 0)
		{
			if (A[i] < 0)
			{
				negative_num++;
				if (negative_num == 1)
					negative_first = A[i];
	
				
			}
			else
			{
				if (negative_num == 1)
					positive_after_negative = true;
			}
			if (negative_num > 0)
				negative = A[i] * negative;
			
			all = all * A[i];
			if (all > max)
				max = all;
			if (negative_num > 0)
			{
				if (negative > 0)
				{
					if (negative > max)
						max = negative;
				}
				else
				{
					if (negative_num > 1 || positive_after_negative)
					{
						if (negative / negative_first > max)
							max = negative / negative_first;
					}
				}
			}
		}
		else
		{
			if (max < 0)
			{
				max = 0;
			}	
			negative_num = 0;
			negative_first = 1;
			negative = 1;
			all = 1;
			positive_after_negative = false;
		}
	}
	return max;
}



说明:

对于一个整数数组只存在0,小于0,大于0,三种数,有两种情况:

           1》对于不包含0的情况下:

                        只有正数和负数,这时就要考虑整个数组的乘积了,可以分为以下三种情况:

                                   a:有奇数个负数 ,比如leetcode中用来测试的样例:[3,-1,4]。

                                   b:有偶数个负数。

                                   c:只有正数。

                         对于这三种情况,我们可以用一个变量"all"记录全部数组的乘积,用一个变量"negative"来记录出现负数之后,从负数开始的之后所有数的乘积,用"negative_first"来记录第一个出现的那个负数,用"negative_num"来记录出现负数的总个数。如果数组中出现了负数即:"negative_num > 0"我们就要用"negative"和最大值"max"作比较,但在这个时候要注意,和"max"作比较只能是正数(关于第一个数是负数的情况可以由全部数组的乘积"all"来处理),如果"negative < 0"说明有奇数个负数,我们要去掉第一个负数,即:"negative / negative_first ;"然后再做比较,同时还要注意[0,-1]和[3,-1,4](这种情况在包含0的情况中再做讨论)的区别,所以我们设定当负数的个数大于1且为奇数时再做纠正工作,对于只有一个负数时另作讨论。

                             每添加一个新的(A[i] != 0)我们都要更新"all"、"negative"、"negative_num"、"negative"、"negative_first"(只更新一次)然后依据情况"all"和"max"作比较,然后是负数是否出现再做比较:"negative"和"max"  或  "negative / negative_first"和"max"。

             2》当0出现时。当0出现时,分3种情况:

                           a:"max"大于0。

                           b:"max"小于0。

                           c:"max"等于0。

                           当"max"小于或等于0时与0作比较肯定是0大,比较之后"max"等于0。当"max"大于0时肯定"max"是不变的。然后初始化"all"、"negative"、"negative_num"等变量。此后,对于0之后的数组元素A[i] != 0就可以依照情况一中再次进行处理。

                            对于[0,-1]和[3,-1,4]这种只出现一次负数的情况,如果复数后面没有数出现即:[0,-1],进行 "negative / negative_first"后可能会出错,于是针对负数之后又出现数的情况,我们用一个bool变量"positive_after_negative"来标记。

你可能感兴趣的:(c++)