求子数组的最大乘积

问题:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度。

解法1:
计算(N-1)个数的组合乘积,假设第i(0 <= i <= N-1)个元素被排除在乘积之外。
设array[]为初始数组,令s[i]表示元素array[i]前所有元素的乘积,0 <= i <= N-1,其中s[0]=1(边界条件),t[i]表示元素array[i]后所有元素的乘积,0 <= i <= N-1,其中,t[N-1] =1(边界条件),那么有,p[i]=s[i]*t[i]。
s[]和t[]可以通过从头至尾和从尾至头扫描两次得到,进而在线性的时间得到p[],再遍历p[]一次得到最大值。时间复杂度为O(N)。

解法2:
首先计算N个整数的乘积p,针对p的正负性进行如下分析。
(1)p为0
那么,数组中至少包含有一个0.假设除去一个0之外,其他N-1个数的乘积为Q,根据Q的正负性进行讨论:
Q为0
说明数组中至少有两个0,那么N-1个数的乘积只能为0,返回0;
Q为正数,则N-1个数的乘积最大值为Q,返回Q;
Q为负数,则N-1个数的乘积最大值为0,返回0;

(2)p为负数
扫描一遍数组,把绝对值最小的负数给去掉,就得到N-1个数的乘积最大值。

(3)p为正数,应该去掉最小的正数值,否则去掉绝对值最大的负数值。

上面的解法采用于直接N个整数的乘积p,进而判断p的正负性的办法,但是直接求乘积在编译环境下往往会有溢出的危险,所以事实上我们可以做一个小转弯,不需要直接求乘积,而是求出数组中正数、负数和0的个数,从而判断p的正负性,其余部分与上面的解法相同。时间复杂度为O(N)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 4,009评论 2 13
  • 定点小数运算 来自:http://www.eepw.com.cn/article/17893.htm 在DSP世界...
    郝宇峰阅读 9,349评论 0 2
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,478评论 1 42
  • 知道简书很久了,一直想找个没人认识的地方,随便说说 不做点什么,全职妈咪做久了,大概会傻掉的吧。 10年的时候,工...
    辛心_55c5阅读 254评论 0 0