[Swift]LeetCode628. 三个数的最大乘积 | Maximum Product of Three Numbers
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10472942.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given an integer array, find three numbers whose product is maximum and output the maximum product.
Example 1:
Input: [1,2,3] Output: 6
Example 2:
Input: [1,2,3,4] Output: 24
Note:
- The length of the given array will be in range [3,104] and all elements are in the range [-1000, 1000].
- Multiplication of any three numbers in the input won't exceed the range of 32-bit signed integer.
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3] 输出: 6
示例 2:
输入: [1,2,3,4] 输出: 24
注意:
- 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
- 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
136ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 if(nums.count == 3){ return nums[0] * nums[1] * nums[2] } 4 let sorted = nums.sorted(by: >) 5 if(sorted[sorted.count - 1] >= 0 || sorted[0] < 0){ 6 return sorted[0] * sorted[1] * sorted[2] 7 } 8 //只有一个负数的情况,取三个正数 9 if(sorted[sorted.count - 1] < 0 && sorted[sorted.count - 2] > 0){ 10 return sorted[0] * sorted[1] * sorted[2] 11 } 12 //有多个负数情况,比较 13 let neg = sorted[sorted.count - 2] * sorted[sorted.count - 1] 14 let pos = sorted[1] * sorted[2] 15 return sorted[0] * max(neg, pos) 16 } 17 }
180ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 var nums = nums 4 nums.sort { $0 > $1 } 5 6 let count = nums.count 7 return max(nums[0] * nums[1] * nums[2], 8 nums[0] * nums[count - 1] * nums[count - 2]) 9 } 10 }
252ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 if nums.count < 3 { 4 return 0 5 } 6 var numsTemp : [Int] = nums.sorted() 7 if numsTemp[1] > 0 { 8 return numsTemp.last! * numsTemp[numsTemp.count - 2] * numsTemp[numsTemp.count - 3] 9 } else { 10 if numsTemp.last! <= 0 { 11 return numsTemp.last! * numsTemp[numsTemp.count - 2] * numsTemp[numsTemp.count - 3] 12 } else { 13 return numsTemp.last! * numsTemp[numsTemp.count - 2] * numsTemp[numsTemp.count - 3] > numsTemp.first! * numsTemp[1] * numsTemp.last! ? numsTemp.last! * numsTemp[numsTemp.count - 2] * numsTemp[numsTemp.count - 3] : numsTemp.first! * numsTemp[1] * numsTemp.last! 14 } 15 } 16 } 17 }
Runtime: 272 ms
Memory Usage: 19 MB
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 var mx1:Int = Int.min 4 var mx2:Int = Int.min 5 var mx3:Int = Int.min 6 var mn1:Int = Int.max 7 var mn2:Int = Int.max 8 for num in nums 9 { 10 if num > mx1 11 { 12 mx3 = mx2 13 mx2 = mx1 14 mx1 = num 15 } 16 else if num > mx2 17 { 18 mx3 = mx2 19 mx2 = num 20 } 21 else if num > mx3 22 { 23 mx3 = num 24 } 25 if num < mn1 26 { 27 mn2 = mn1 28 mn1 = num 29 } 30 else if num < mn2 31 { 32 mn2 = num 33 } 34 } 35 return max(mx1 * mx2 * mx3, mx1 * mn1 * mn2) 36 } 37 }
320ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 if nums.count < 3 { return Int.min } 4 var max1 = Int.min 5 var max2 = max1 6 var max3 = max1 7 var min1 = Int.max 8 var min2 = Int.max 9 10 nums.forEach { 11 if $0 >= max1 { 12 max3 = max2 13 max2 = max1 14 max1 = $0 15 } else if $0 >= max2 { 16 max3 = max2 17 max2 = $0 18 } else if $0 > max3 { 19 max3 = $0 20 } 21 22 if $0 <= min1 { 23 min2 = min1 24 min1 = $0 25 } else if $0 <= min2 { 26 min2 = $0 27 } 28 } 29 let val1 = max1 * max2 * max3 30 let val2 = min1 * min2 * max1 31 32 return max(val1, val2) 33 } 34 }
388ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 4 let sorted = nums.sorted() 5 6 if sorted[sorted.count - 1] == 0 { 7 return 0 8 } else if sorted[sorted.count - 1] < 0 { 9 return sorted[0] * sorted[1] * sorted[sorted.count - 1] 10 } else if sorted[0] >= 0 { 11 return sorted[sorted.count - 1] * sorted[sorted.count - 2] * sorted[sorted.count - 3] 12 } else { 13 return max(sorted[sorted.count - 1] * sorted[sorted.count - 2] * sorted[sorted.count - 3], 14 sorted[0] * sorted[1] * sorted[sorted.count - 1]) 15 } 16 } 17 }
392ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 let sorted = nums.sorted() 4 return max(sorted[nums.count - 1] * sorted[nums.count - 2] * sorted[nums.count - 3], sorted[nums.count - 1] * sorted[0] * sorted[1]) 5 } 6 }
404ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 if nums.count == 3 { 4 return nums.reduce(1, *) 5 } 6 var sort = nums.sorted(by: >) 7 let one = sort[0] * sort[1] * sort[2] 8 let two = sort[0] * sort[nums.count - 1] * sort[nums.count - 2] 9 10 return max(one, two) 11 } 12 }
440ms
1 class Solution { 2 func maximumProduct(_ nums: [Int]) -> Int { 3 let sortGreatestToLeast: [Int] = nums.sorted(by: >) 4 let greatestThreeNums: [Int] = Array(sortGreatestToLeast.prefix(3)) 5 let leastTwoNums: [Int] = Array(sortGreatestToLeast.suffix(2)) 6 let productFromGreatest: Int = greatestThreeNums.reduce(1, { x, y in x * y }) 7 let productFromBoth: Int = leastTwoNums.reduce(1, { x, y in x * y }) * greatestThreeNums.first! 8 return productFromGreatest > productFromBoth ? productFromGreatest : productFromBoth 9 } 10 }