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