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])); } }