LeetCode - 628. Maximum Product of Three Numbers 数组中三个数的最大累成积 简单题

发布于 2024-07-11 08:27:33 字数 2934 浏览 15 评论 0

题目

排序方法

很容易想到最大的累成积只有可能是最大的三个数相乘 (max1 * max2 * max3)或者最大数(max1) * 最小的数(min1) * 次小的数(min2)

于是第一种方法就是排序,然后找出这些数即可。

class Solution {
  public int maximumProduct(int[] nums) {
    Arrays.sort(nums);
    return Math.max(nums[0] * nums[1] * nums[nums.length - 1],
        nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3]
    );
  }
}

O(N) 的方法

很明显这题不会是用排序 N * logN 的复杂度,其实只需要记录几个变量就可以找出这五个值,于是下面的代码是很容易写出来的,遍历三次,每次 O(N) ,显然这种办法有点累赘,可以从 3 * N 优化到 N

class Solution {
  public int maximumProduct(int[] nums) {
    int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
    int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
    int min1I = -1, max1I = -1, max2I = -1;

    for (int i = 0; i < nums.length; i++) {
      if (nums[i] < min1) {
        min1 = nums[i];
        min1I = i;
      }
      if (nums[i] > max1) {
        max1 = nums[i];
        max1I = i;
      }
    }
    for (int i = 0; i < nums.length; i++) {
      if (i == min1I || i == max1I)
        continue;
      if (nums[i] < min2) {
        min2 = nums[i];
      }
      if (nums[i] > max2) {
        max2 = nums[i];
        max2I = i;
      }
    }
    for (int i = 0; i < nums.length; i++) {
      if (i == max1I || i == max2I) //注意这里不要多余的加上 i == min1I 不然出错
        continue;
      if (nums[i] > max3) {
        max3 = nums[i];
      }
    }
    return Math.max(max1 * max2 * max3, max1 * min1 * min2);
  }
}

注意到其中的层次关系和更新的关系,即可写出下面的代码:

class Solution {
  public int maximumProduct(int[] nums) {
    int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
    int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;

    for (int i = 0; i < nums.length; i++) {
      //judge max
      if (nums[i] > max1) {
        max3 = max2;
        max2 = max1;
        max1 = nums[i];
      } else if (nums[i] > max2) {
        max3 = max2;
        max2 = nums[i];
      } else if (nums[i] > max3) {
        max3 = nums[i];
      }
      // judge min
      if (nums[i] < min1) {
        min2 = min1;
        min1 = nums[i];
      } else if (nums[i] < min2) {
        min2 = nums[i];
      }
    }
    return Math.max(max1 * max2 * max3, max1 * min1 * min2);
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

久夏青

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文