zoukankan      html  css  js  c++  java
  • 编程之美2.13子数组的最大乘积

    题目:

    给定一个长度为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)。

  • 相关阅读:
    2018-2019-2 20165333 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
    2018-2019-2 20165333 《网络对抗技术》 Exp5:MSF基础应用
    2018-2019-2 网络对抗技术 20165333 Exp4 恶意代码分析
    2018-2019-2 网络对抗技术 20165333 Exp3 免杀原理与实践
    2018-2019-2 网络对抗技术 20165333 Exp2 后门原理与实践
    2018-2019-2 网络对抗技术 20165333 Exp1 PC平台逆向破解
    2018-2019-2 网络对抗week1 Kali安装 20165333陈国超
    第三次作业+105032014138
    第二次作业+105032014138
    实验三+138+牟平
  • 原文地址:https://www.cnblogs.com/SeekHit/p/5206790.html
Copyright © 2011-2022 走看看