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

    给定义个长度为N的整数数组,只允许用乘法,不能用除法,计算在任意(N-1)的个数的组合中乘积最大的一组。

    【思路】

    突然变成了雅黑,挺不习惯的~~还是雅黑好看✪ω✪

    实现起来很简单,但我是不会想到这样的思路的……看来除了积累别想着有别的途径来提高了π__π

    1.用空间换时间,开数组s和t,分别保存从前向后的连乘结果和从后向前的连乘结果。对于每个排除了第i个元素的N-1个元素组合p[i],

    有p[i]=s[i-1]*t[i+1],求得所有的p[i],遍历一次即可得最大值。

    2.假设N个整数的乘积为P,对P进行正负分析:

    1)P=0

    数组中至少含有一个0,假设出去该0之外,其他N-1个数的乘积为Q,再根据Q的正负性讨论:

    a。Q=0:数组至少有两个0,N-1个数的乘积只能为0,返回0;

    b。Q>0:返回Q;

    c。Q<0:用0替代任意数值为0,返回0.

    2)P>0

    如果数组中存在正数,则去掉最小正数,若数组全是负数,则去掉绝对值最大负数。

    3)P<0

    由负负得正,N个元素去掉一个负数,乘积得到一个正数,则需去掉一个绝对值最小的负数。

    【codes】

    法一:

    int maxMulti(int N[], int n)
    {
        int *s=new int[n+1];
        int *t=new int[n+1];
        int *p=new int[n];
        int remax=INT_MIN;
        s[0]=1;
        t[n]=1;
        for(int i=1; i<=n; i++)
            s[i]=s[i-1]*N[i-1];
        for(int i=n-1; i>=0; i--)
            t[i]=t[i+1]*N[i];
        for(int i=0; i<n; i++){
            p[i]=s[i-1]*t[i+1];
            if(p[i]>remax)
                remax=p[i];
        }
        delete [] s;
        delete [] t;
        delete [] p;
        return remax;
    }

    法二:

    int maxMulti1(int N[], int n)
    {
        int multi=1;
        for(int i=0; i<n; i++)
            multi*=N[i];
        if(multi==0){
            int q=1;
            int count=0;
            for(int i=0; i<n; i++)
                if(N[i]!=0){
                    q*=N[i];
                    count++;
                }
            if(count<n-1) return 0;
            else if((count==n-1)&&(q>0)) return q;
            else if((count==n-1)&&(q<0)) return 0;
        }
        else if(multi>0){
            int r=0;
            int j;
            for(int i=0; i<n; i++)
                if(N[i]>r){
                    r=N[i];
                    j=i;
                }
            if(r==0)
                for(int i=0; i<n; i++)
                    if(abs(N[i])>r){
                        r=abs(N[i]);
                        j=i;
                    }
            int q=1;
            for(int i=0; i<n&&i!=j; i++)
                q*=N[i];
            return q;
        }
        else if(multi<0){
            int r=0;
            int j;
            for(int i=0; i<n; i++)
                if(abs(N[i]>r)){
                    r=abs(N[i]);
                    j=i;
                }
            int q=1;
            for(int i=0; i<n&&i!=j; i++)
                q*=N[i];
            return q;    
        }
    }

    【评价】

    题目很简单,但思路想不出。第二种方法写的冗长了。

  • 相关阅读:
    Hexo命令无法找到 -问题修复
    技术的本质
    java 多线程总结篇4——锁机制
    java 多线程总结篇3之——生命周期和线程同步
    java 多线程总结篇2之——Thread类及常用函数
    java 多线程总结篇1之——基本概念
    java IO流的继承体系和装饰类应用
    java IO流知识点总结
    java IO流之——File类知识总结和面试
    为什么需要学UML建模
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4519910.html
Copyright © 2011-2022 走看看