2018拼多多笔试最大乘积问题(与网易合唱团动态规划相似)

  • 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
  • 动态规划算法
#include<iostream>
#include<vector>
using namespace std;
#define MAX 10000
inline long long max(long  long a,long long b){return a>b?a:b;}
inline long long  min(long long a,long long b){return a>b?b:a;}
int main()
{
    vector<int> data;
    int number,n;
    long long pMax[3][MAX]={0};
    long long pMin[3][MAX]={0};
    cin >> n;
    for(int i=0;i<n;i++)
    {
        cin>>number;
        data.push_back(number);
    }
        
    int size = data.size();
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<size;j++)
        {
            if(i==0)
                pMax[i][j]=pMin[i][j]=data[j];
            else
            {
                for(int k=j-1;k>=0;k--)
                {
                    pMax[i][j]=max(pMax[i][j],max(pMax[i-1][k]*data[j],pMin[i-1][k]*data[j]));
                    pMin[i][j]=min(pMin[i][j],min(pMax[i-1][k]*data[j],pMin[i-1][k]*data[j]));
                }
            }
        }
    }
    long long res = 0;
    for(int i=0;i<size;i++)
        res = max(res,pMax[2][i]);
    cout << res<<endl;
    return 0;
}
  • 和网易的笔试题相似,更简单一些,分析请看网易合唱团动态规划
  • 待续进一步更新算法使其满足时间和空间要求。
/*定义五个数,一个最大,一个次大,一个第三大,一个最小,一个次小。
只要找到这五个数,问题就解决了。因为最大乘积只可能是
最大*(次大*第三大) 或者是 最大*(最小*次小)。时间复杂度O(n),
空间复杂度O(1)。PS:这道题输入有问题,题目给的样例是直接给了一组数,
而此时用例先给了一个数的个数n,然后再给了一组数*/
#include<iostream>
#include<limits.h>
using namespace std;
int main()
{
    long long min_fir=INT_MAX,min_sec=INT_MAX;
    long long max_fir=INT_MIN,max_sec=INT_MIN,max_third=INT_MIN;
    int n,num;
    long long mul;
    cin>>n;
    for(int i=0;i<n;i++)
    {
         cin>>num;
         if(num<min_fir)
            {
                min_sec = min_fir;
                min_fir = num;
            }
            else if(num<min_sec)
                min_sec = num;
            if(num>max_fir)
            {
                max_third = max_sec;
                max_sec = max_fir;
                max_fir = num;
            }
            else if(num>max_sec)
            {
                max_third = max_sec;
                max_sec = num;
            }
            else if(num>max_third)
                max_third = num;
    }
    mul = max_fir*max_sec*max_third > max_fir*min_fir*min_sec ? max_fir*max_sec*max_third : max_fir*min_fir*min_sec;
    cout<<mul<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Leader_wang/article/details/89163963