【LeetCode】數組-2(628)-數組中三個數相乘最大
阿新 • • 發佈:2017-08-17
負數 [] 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)-數組中三個數相乘最大