[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ビットの符号付き整数の範囲を超えません。
問題解決方法
- 最初に配列を並べ替えます。時間計算量はO(nlogn)です。
- 0未満の数はいくつあるかわからないので、小さい0の数で区別して判断する必要があります。
- 注:実際、ここでは最大の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%を打ち負かす