列表

详情


PDD1. 最大乘积

描述

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

输入描述

输入共2行,第一行包括一个整数n,表示数组长度 第二行为n个以空格隔开的整数,分别为A1,A2, … ,An

输出描述

满足条件的最大乘积

示例1

输入:

4
3 4 1 2

输出:

24

原站题解

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-09-02

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>

#include <iostream>
#include <vector>
using namespace std;

#define MALLOC(num,type) (type*)malloc((size_t)num * sizeof(type))

long long n,a[10000000];

int main()
{
	//前k个最大值------时间复杂度为:O(n)
	
	//输入数组
	long n=0;scanf("%ld",&n);
	long *a = MALLOC(n,long);
	for(int i=0;i<n;i++)
	{
		scanf("%ld",a+i);
	}

	//对前K个进行排序,插入排序方法
	long *mem = MALLOC(n,long);
	int Temp,j,K=3;
	mem[0] = a[0];
	for(int P=1; P<K; P++)
	{
		Temp = a[P];
		for(j = P; j>0 && mem[j-1] > Temp; j--)
		{
			mem[j] = mem[j-1];
		}
		mem[j] = Temp;
	}


	//对新读入数据排序,插入到正确位置
	for(int i = 3;i<n;++i)
	{
		Temp = a[i];
		if(Temp > mem[K-1])
		{
			for(j = K-1; j>0 && mem[j-1] < Temp; j--)
				mem[j] = mem[j-1];
			mem[j] = Temp;
		}
	}
	long ans = mem[0]*mem[1]*mem[2];
    long a1=mem[0],a2=mem[1],a3=mem[2];
	if(a[0]==a1) {
		a2 = a[1];
		a3 = a[2];
	}
	else if(a[1]==a1)
	{
		a2=a[0];
		a3=a[2];
	}
	else
	{
		a2=a[0];
		a3=a[1];
	}
	if(a2>a3) swap(a2,a3);
	for(int i=2;i<n;i++)
	{
		if(a[i]<a3)
		{
			if(a[i]<a2)
			{
				a3=a2;
				a2=a[i];
			}
			else
			{
				a3=a[i];
			}
		}
	}
	ans = max(ans,a1*a2*a3);
	//printf("%lld\n",ans);
	cout<<ans;
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-08-24

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(int argc,char *argv[])
{
    int n;
    cin >> n;
    
    vector <long long> temp(n);
    
    long max1 = 1;
    long max2 = 1;
    long max3 = 1;
    long min1 = 1;
    long min2 = 1;
    
    for(int i = 0; i < n; i++)
        {
        
        cin >> temp[i];
        
        if(temp[i] > max3)
            {
            max1 = max2;
            max2 = max3;
            max3 = temp[i];
        }
        else
            if(temp[i] > max2)
                {
                max1 = max2;
                max2 = temp[i];
            }
        else
            if(temp[i] > max1)
                {
                max1 = temp[i];
            }
        else
            if(temp[i] < min1)
                {
                min2 = min1;
                min1 = temp[i];
			}
        else
            if(temp[i] < min2)
                {
                min2 = temp[i];
            }
    }
    
    
    
    cout << max(max1 * max2 * max3,max3 * min1 * min2);
    
    return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-08-17

#include <iostream>
#include <limits.h>
#include <algorithm>

using namespace std;

int main() {
	int n;
	while (cin >> n) {
		if (n < 3) {
			int i = 0;
			int tmp;
			while (i < n)
				cin >> tmp;
			cout << -1 << endl;;
			continue;
		}
		long long min1 = INT_MAX;
		long long min2 = INT_MAX;
		long long max1 = INT_MIN;
		long long max2 = INT_MIN;
		long long max3 = INT_MIN;
		int i = 0;
		int tmp;
		while (i < n) {
			cin >> tmp;
			if (tmp > max1) {
				max3 = max2;
				max2 = max1;
				max1 = tmp;
			}
			else if (tmp > max2) {
				max3 = max2;
				max2 = tmp;
			}
			else if (tmp > max3) {
				max3 = tmp;
			}
			if (tmp < min1) {
				min2 = min1;
				min1 = tmp;
			}
			else if (tmp < min2) {
				min2 = tmp;
			}
			++i;
		}
		long long res = max(max1 * max2 * max3, max1 * min1 * min2);
		cout << res << endl;
	}
	return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-08-12

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
    int N,i;
    while(scanf("%d",&N)!=EOF){
        vector<long long> d(N);
        for(i=0;i<N;i++) scanf("%lld",&d[i]);
        sort(d.begin(),d.end());
        printf("%lld\n",max(d[0]*d[1]*d[N-1],d[N-1]*d[N-2]*d[N-3]));
    }
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2017-08-10

#include<iostream>
#include<algorithm>

using namespace std;
int main(){
    int N,i;
    while(scanf("%d",&N)!=EOF){
        vector<long long> d(N);
        for(i=0;i<N;i++) scanf("%lld",&d[i]);
        sort(d.begin(),d.end());
        printf("%lld\n",max(d[0]*d[1]*d[N-1],d[N-1]*d[N-2]*d[N-3]));
    }
}

上一题