【LeetCode】数组-2(628)-数组中三个数相乘最大

题目不难:

思路一(排序取两端)

先排序,最后三个数相乘即可。(很快就想到了,但是没想全面 [😂] )

缺陷:没有考虑到有负数的情况,当至少有两个负数时,需要判断 最大数乘两个最小的负数 和 三个最大数相乘的大小,返回大的。

代码如下:

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)

 

posted @ 2017-08-16 23:23  菜鸟更要虚心学习  阅读(153)  评论(0编辑  收藏  举报