leetcode-628-Maximum Product of Three Numbers
阿新 • • 發佈:2018-05-11
ssi arr spa tip iss beat nth col 就是
題目描述:
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
Note:
- The length of the given array will be in range [3,104] and all elements are in the range [-1000, 1000].
- Multiplication of any three numbers in the input won‘t exceed the range of 32-bit signed integer.
要完成的函數:
int maximumProduct(vector<int>& nums)
說明:
1、這道題目給了一個vector,要求返回一個最大值,這個最大值由vector中的三個元素相乘得到。
如果vector中只有正數,那麽沒有疑問,最大值由最大的三個元素相乘得到。
但如果vector中有負數,那麽最大值也有可能由兩個最小的負數乘以最大的正數得到。
但是無論如何,要不就是三個最大的正數相乘得到,要不就是兩個最小的負數乘以最大的正數得到,不可能由中間的數相乘得到。
思路很清晰,代碼如下:
int maximumProduct(vector<int >& nums)
{
sort(nums.begin(),nums.end());
int a=nums[0]*nums[1]*nums[nums.size()-1];//倆最小負數乘以最大正數
int b=nums[nums.size()-1]*nums[nums.size()-2]*nums[nums.size()-3];//三個最大的正數
return a>b?a:b;
}
上述代碼實測69ms,beats 44.94% of cpp submissions。
2、改進:
其實我們不需要全排整個vector,我們只要部分排序之後的第一位、第二位、倒數第一位、倒數第二位以及倒數第三位的值。
所以使用nth_element來處理。代碼如下:
int maximumProduct(vector<int>& nums)
{
int s1=nums.size();
nth_element(nums.begin(),nums.begin(),nums.end());
int a=nums[0];
nth_element(nums.begin(),nums.begin()+1,nums.end());
int b=nums[1];
nth_element(nums.begin(),nums.end()-1,nums.end());
int c=nums[s1-1];
nth_element(nums.begin(),nums.end()-2,nums.end());
int d=nums[s1-2];
nth_element(nums.begin(),nums.end()-3,nums.end());
int e=nums[s1-3];
int f=c*d*e;
int g=a*b*c;
return f>g?f:g;
}
上述代碼實測56ms,beats 74.16% of cpp submissions。
leetcode-628-Maximum Product of Three Numbers