题目:
Given an integer array, find three numbers whose product is maximum and output the maximum product.
Example 1:
Input: [1,2,3] Output: 6
Example 2:
Input: [1,2,3,4] Output: 24
分析:
给定一个数组,返回其中三个元素乘积的最大值。
注意的是,这道题是可以有负数出现,且是求三个数的乘积,所以我们需要考虑负数的情况。
最先想到的是利用排序解决,我们要比较最大的三个数的乘积和最大的数还有最小的两个数的乘积,也就是求max(max1*max2*max3,max1*min1*min2),因为如果最小的两个数是负数且他们的绝对值很大,这样的乘积也会是大的,要考虑这种情况。
因为实际上我们的答案仅需要5个数就可以解决,我们可以在遍历数组的时候求出来,从而节省排序的时间,降低时间复杂度。
程序:
// sort class Solution { public: int maximumProduct(vector<int>& nums) { sort(nums.begin(), nums.end(), greater<int>()); int n = nums.size(); return max(nums[0]*nums[1]*nums[2], nums[0]*nums[n-1]*nums[n-2]); } };
class Solution { public: int maximumProduct(vector<int>& nums) { int min1 = INT_MAX, min2 = INT_MAX; int max1 = INT_MIN ,max2 = INT_MIN, max3 = INT_MIN; for(auto i:nums){ if(i > max1){ max3 = max2; max2 = max1; max1 = i; } else if(i > max2){ max3 = max2; max2 = i; } else if(i > max3) max3 = i; if(i < min1){ min2 = min1; min1 = i; } else if(i < min2) min2 = i; } return max(max1*max2*max3, max1*min1*min2); } }; // class Solution { // public: // int maximumProduct(vector<int>& nums) { // priority_queue<int, vector<int>, less<int> > p; // priority_queue<int, vector<int>, greater<int> > q; // for(auto i:nums){ // p.push(i); // q.push(i); // } // int minn[2] = {0}; // int maxn[3] = {0}; // for(int i = 0; i < 3; ++i){ // maxn[i] = p.top(); // p.pop(); // } // for(int i = 0; i < 2; ++i){ // minn[i] = q.top(); // q.pop(); // } // return max(maxn[0]*maxn[1]*maxn[2], maxn[0]*minn[0]*minn[1]); // } // };