1. 程式人生 > >【LeetCode】數組-2(628)-數組中三個數相乘最大

【LeetCode】數組-2(628)-數組中三個數相乘最大

負數 [] product leet ont 沒有 程序 時間復雜度 array

題目不難:

思路一(排序取兩端)

先排序,最後三個數相乘即可。(很快就想到了,但是沒想全面 [??] )

缺陷:沒有考慮到有負數的情況,當至少有兩個負數時,需要判斷 最大數乘兩個最小的負數 和 三個最大數相乘的大小,返回大的。

代碼如下:

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

復雜度分析 主要是排序比較浪費

時間復雜度:O(n*logn)

空間復雜度:O(n*logn)

思路二(不排序,只遍歷一次,只保存三個最大的,和兩個最小的)

此題get新技能 最大數和最小數的表示法。Integer.MAX_VALUE Integer.MIN_VALUE

註意更新時不能只判斷一個,其他的也要判斷,要不就丟解了。下面程序說明。

(錯誤代碼示範)

 1 public class Solution {
 2     public int maximumProduct(int[] nums) {
 3         if (nums == null || nums.length < 1) {
4 return -1; 5 } 6 int min1 = Integer.MAX_VALUE; 7 int min2 = Integer.MAX_VALUE; 8 int max1 = Integer.MIN_VALUE; 9 int max2 = Integer.MIN_VALUE; 10 int max3 = Integer.MIN_VALUE; 11 12 for (int i : nums) { 13 if
(i < min1) { 14 min2 = min1; 15 min1 = i; 16 } 17 if (i > max1) { 18 max3 = max2; 19 max2 = max1; 20 max1 = i; 21 } 22 } 23 return Math.max(max1 * max2 * max3, min1 * min2 * max3); 24 } 25 }

(正確的代碼)還要註意不等號中的等號不能省略,因為可能有相等的情況。

 1 public class Solution {
 2     public int maximumProduct(int[] nums) {
 3         if (nums == null || nums.length < 1) {
 4             return -1;
 5         }
 6         int min1 = Integer.MAX_VALUE;
 7         int min2 = Integer.MAX_VALUE;
 8         int max1 = Integer.MIN_VALUE;
 9         int max2 = Integer.MIN_VALUE;
10         int max3 = Integer.MIN_VALUE;
11         
12         for (int i : nums) {
13             if (i <= min1) {
14                 min2 = min1;
15                 min1 = i;
16             } else if (i >= min1 && i <= min2) {
17                 min2 = i; //別忘了更新 min2 哦,下面同理~
18             }
19             if (i >= max1) {
20                 max3 = max2;
21                 max2 = max1;
22                 max1 = i;
23             } else if (i <= max1 && i >= max2) {
24                 max3 = max2;
25                 max2 = i;
26             } else if (i <= max2 && i >= max3) {
27                 max3 = i;
28             }
29         }
30         return Math.max(max1 * max2 * max3, min1 * min2 * max1);
31     }
32 }

復雜度分析

時間復雜度:O(n)

空間復雜度:O(1)

【LeetCode】數組-2(628)-數組中三個數相乘最大