1. 程式人生 > >leetcode-628-Maximum Product of Three Numbers

leetcode-628-Maximum Product of Three Numbers

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:

  1. The length of the given array will be in range [3,104] and all elements are in the range [-1000, 1000].
  2. 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