注意:是连续子数组;而子序列表示原来的顺序不变,但是可以除去中间的任意元素;
思路一:
- 将第一个值都和后面的每个值分别相乘,相乘的过程中找出最大值;
- 接着讲第二个值与后面的每个值分别相乘,找出最大值;
- 最后将最大值在比较出最终的最大值。
时间复杂度:O(n2)
int GetMax(int a[], const int &length)
{
int i=0,j=0;
int sum=a[0];
for(i=0;i<length;i++)
{
int sum2=a[i];
for(j=i+1;j<length;j++)
{
sum2 *= a[j];
if(sum2 > sum)
sum = sum2;
}
if(sum2 > sum)
sum = sum2;
}
return sum;
}
思路二:
- 如果无0且负数的个数为偶数,则将数组中所有数相乘即可;
- 如果无0且负数的个数为奇数,则定位最左边和最右边的负数的下标(pos1,pos2),然后将pos2左边的数全部相乘得到result1(不包括pos2),同理将pos1右边的数相乘得到result2,然后比较result1和result2即可;
- 如果出现0(一个或者多个),则将0作为分界点,分别使用上述两个步骤求出最大值,然后在比较各个最大值即可。

该博客介绍了一种解决笔试题的方法,即求解数组中最大连续子数组的乘积。通过遍历数组,逐个元素与后续元素相乘并记录最大值。当数组中无0且负数个数为偶数时,直接相乘;若负数个数为奇数,需找到最左侧和最右侧的负数,分别计算左右两侧的乘积进行比较。如果有0,需要以0为界重复上述步骤,最后选取最大乘积。
最低0.47元/天 解锁文章
1461

被折叠的 条评论
为什么被折叠?



