题目:

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

如果把所可能的乘积找出来,共有(N-1)个数,n个n-1的数的组合,时间复杂度为O(N^2)。

解法一:

在一个数组中,以i为界限,分别计算i前面s[i-1]的积,后面t[i+1]的积

p[i]=s[i-1]*t[i+1]即为这个数组中除去i的所有数的乘积。

时间复杂度为,从头到尾和从尾到头遍历数组得到s[]和t[]的时间,加上p[]的时间3N,加上查找最大值的时间复杂度,最后总得时间复杂度为O(n)。

注意在代码编写的过程中,因为若干个数的乘积较大,需要把数组定义为longlong型。

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 #define MAXN 1000
 6
 7 long long A[MAXN];
 8 long long s[MAXN];
 9 long long t[MAXN];
10 long long p[MAXN];
11
12 int main()
13 {
14     int n, i;
15     cin >> n;
16     for (i=1; i<=n; i++)
17         cin >> A[i];
18     // 从前往后用叠乘法
19     s[0] = 1;
20     for (i=1; i<n; i++)
21         s[i]=A[i]*s[i-1];
22     // 从后往前用叠乘法
23     t[n+1] = 1;
24     for (i=n; i>1; i--)
25         t[i]=A[i]*t[i+1];
26     // 计算出n-1个n-1数连乘
27     for (i=0; i<=n-1; i++)
28         p[i] = s[i]*t[i+2];
29     long long maximum = p[0];
30     // 获取其中的最大值
31     for (i=1; i<=n-1; i++)
32         maximum = max(maximum, p[i]);
33     cout <<"max is "<< maximum << endl;
34 }

解法二

近一步分析,假设N个整数的乘积为P,从P的正负性下手。

1.P=0;数组中至少含一个0。除去一个0,其他N-1个数的乘积为Q

  Q=0;数组中至少2个0;所以N-1的乘积依然为0;

  Q>0;用0替换N-1中的任意一个数,得出的Pn-1=0,所以最大值为Q;

  Q<0;用0替换N-1中的任意数,Pn-1=0,最大值为0;

2.P<0

  如果去除数组中的一个负数,剩下的n-1个数的乘积为正,去掉绝对值最小的负数得到的n-1个数最大。

3.P>0

  去掉数组汇总最小的正数值,如果没有正数都是负数,取出绝对值最大的负数值。

判断正负的过程,一般不使用所有数据直接相乘的操作,因为数据的值可能过大,有溢出的危险,所以可以通过判断数组中,正数,负数,零的个数。遍历一次数组,即可得到这些数据,还有绝对值最大最小的正负数。时间复杂度为O(N)。

转载于:https://www.cnblogs.com/SeekHit/p/5206790.html

编程之美2.13子数组的最大乘积相关推荐

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

          这道题目是求 n-1 个数的最大乘积,即数组大小为 n,则会存在 n 个 n-1 的连续数字,那么,我们需要寻找的是最大的那一个乘积.       其实看到题目,感觉很简单,循环走两遍数组 ...

  2. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

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

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  4. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  5. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  6. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

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

          这是一个在面试中出现概率很高的一道题目,就拿我来说吧,面试了5家公司中,两家公司问了这道题目,可见,这道题目是非常经典的.       解题思想也不是很难,我熟悉的有:两种解题办法:   ...

  8. 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

          首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵 ...

  9. 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

    Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containin ...

最新文章

  1. HTML5 input placeholder 颜色 改动
  2. leetcode2 两数相加
  3. ZooKeeper:win7上安装单机及伪分布式安装
  4. 一步搞清楚多态与类初始化的底层原理
  5. 异常注意事项_子父类异常
  6. 九大经典算法之基数排序、桶排序
  7. 第二波 编程资料免费领,前后端、移动端都有
  8. mysql 存储过程执行ddl_mysql存储过程执行ddl语句
  9. IT项目管理之系统规划
  10. PDF背景怎么添加,如何修改PDF背景
  11. 计算机组成原理试题,计算机组成原理试卷A卷.doc
  12. c语言相机翻译器下载,拍照翻译器
  13. python库源码阅读:ddddocr
  14. 【优化模型】行遍性问题 — 中国邮递员问题
  15. 完美显示html的版权符号
  16. 上海好吃加好玩-详细分类版
  17. python修改word文本框中的内容
  18. python爬虫免登录_爬虫使用cookie免登陆
  19. hover父元素,不希望子元素消失(子元素盒子在下方展开,但鼠标移到子元素时盒子却消失了)
  20. python快速_Python3快速入门

热门文章

  1. PAT_B_1003_Java(20分)
  2. c语言联合验证大小端存储,2021C语言面试题及答案.docx
  3. mysql 5.5 slave 配置_mysql5.5 master-slave(Replication)配置方法
  4. 计组—缓存Cache
  5. Python+Opencv根据颜色进行目标检测
  6. HOG特征(Histogram of Gradient)学习总结
  7. C#中的thread和task之 Thread ThreadPool
  8. pycharm中如何调用Anoconda的库
  9. 欢迎使用CSDN-markdown编辑器test
  10. 信用社和民营银行存款利息都高,有5万块钱存哪个更安全?