题目不难:
思路一(排序取两端)
先排序,最后三个数相乘即可。(很快就想到了,但是没想全面 [?] )
缺陷:没有考虑到有负数的情况,当至少有两个负数时,需要判断 最大数乘两个最小的负数 和 三个最大数相乘的大小,返回大的。
代码如下:
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)