[LeetCode] 628. 3つの数字の最大積(簡単)(JAVA)1日1つの質問

[LeetCode] 628. 3つの数値の最大積(簡単)(JAVA)

タイトルアドレス:https//leetcode.com/problems/maximum-product-of-three-numbers/

タイトル説明:

整数配列numsが与えられた場合、積が最大である3つの数値を見つけて、最大の積を返します。

例1:

Input: nums = [1,2,3]
Output: 6

例2:

Input: nums = [1,2,3,4]
Output: 24

例3:

Input: nums = [-1,-2,-3]
Output: -6

制約:

  • 3 <= nums.length <= 10 ^ 4
  • -1000 <= nums [i] <= 1000

一般的なアイデア

整数配列が与えられた場合、配列内の3つの数値の最大の積を見つけて、この積を出力します。

注意:

指定された整数配列の長さの範囲は[3,104]であり、配列内のすべての要素の範囲は[-1000、1000]です。
入力配列内の任意の3つの数値の積は、32ビットの符号付き整数の範囲を超えません。

問題解決方法

  1. 最初に配列を並べ替えます。時間計算量はO(nlogn)です。
  2. 0未満の数はいくつあるかわからないので、小さい0の数で区別して判断する必要があります。
  3. 注:実際、ここでは最大の3つの数値と最小の2つの数値のみが使用されます。これらの5つの数値を見つけるだけで、時間計算量O(n)に最適化できます。
class Solution {
    public int maximumProduct(int[] nums) {
        if (nums.length < 3) return 0;
        Arrays.sort(nums);
        if (nums[nums.length - 1] <= 0) return nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3];
        if (nums[nums.length - 2] <= 0) return nums[0] * nums[1] * nums[nums.length - 1];
        if (nums[nums.length - 3] <= 0) return nums[0] * nums[1] * nums[nums.length - 1];
        return Math.max(nums[0] * nums[1], nums[nums.length - 2] * nums[nums.length - 3]) * nums[nums.length - 1];
    }
}

実行時間:12ミリ秒、Javaユーザーの69.60%を打ち負かす
メモリ消費量:40.1 MB、Javaユーザーの16.51%を打ち負かす

私の公式アカウントに注意を払うことを歓迎します、LeetCodeは毎日1つの質問を更新します

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/112857263