LeetCode数组遍历628

122 阅读1分钟

🍀 三个数的最大乘积

描述:

 # 给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
 ​
 示例 1:
 输入:nums = [1,2,3]
 输出:6
 ​
 示例 2:
 输入:nums = [1,2,3,4]
 输出:24
 ​
 示例 3:
 输入:nums = [-1,-2,-3]
 输出:-6
  
 ​
 提示:
 3 <= nums.length <= 104
 -1000 <= nums[i] <= 1000

思考:

数组中三个数的最大乘积,数组长度大于等于三,很容易想到经过排序后得到最大三个数的乘积,但是有一个问题,如果是[-4, -1, 2, 3]那么后面最大的是-6,其实最大乘积是12!

  1. 如果后面三个数有三个负数[-4, -3, -2, -1],直接后面三个相乘最大。
  2. 如果后面三个数有两个负数[-4, -3, -2, 1],后面三个相乘和前面两个以及后面一个相乘作比较。
  3. 如果后面三个数有一个负数[-4, -3, 2, 1],后面三个相乘和前面两个以及后面一个相乘作比较。
  4. 如果后面三个数没有负数[1, 2, 3, 4],直接后面三个相乘最大。

总结:后面三个相乘和前面两个以及后面一个相乘作比较就可以了!

实现:

 public class Solution {
 ​
     public int maximumProduct(int[] nums) {
         int len = nums.length;
         int max1, max2;
         Arrays.sort(nums);
 ​
         max1 = nums[len - 1] * nums[len - 2] * nums[len - 3];
         max2 = nums[len - 1] * nums[1] * nums[0];
 ​
         return max1 > max2 ? max1 : max2;
     }
 ​
 }

测试一下!

image.png

大佬的代码:

不用排序,找出最大的3个和最小的2个数。和上一个数组题的思想很相似!

O(n)时间,O(1)空间,击败了 97.45% 的用户!!!

 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 < min1) {
                 min2 = min1;
                 min1 = i;
             } else if (i < min2) {
                 min2 = i;
             }
             
             if (i > max1) {
                 max3 = max2;
                 max2 = max1;
                 max1 = i;
             } else if (i > max2) {
                 max3 = max2;
                 max2 = i;
             } else if (i > max3) {
                 max3 = i;
             }
         }
         
         return max(min1*min2*max1, max1*max2*max3);
     }
 };