整形数组nums,在数组中找出由三个数字组成的最大乘积,并输出这个乘积。(乘积不会越界。不考虑超过int的最大值)
重点考察:线性扫描。
暴力破解
- 先排序
- 全是正数或全是负数,则nums[length-1]*nums[length-2]*nums[length-3]
- 有负数有正数,则要么是nums[length-1]*nums[length-2]*nums[length-3],要么是nums[0]*nums[1]*nums[length-1]
package main
import (
"fmt"
"math"
"sort"
)
func find3MaxProduct(nums []int)int{
sort.Ints(nums)
length := len(nums)
res := math.Max(float64(nums[0]*nums[1]*nums[length-1]),
float64(nums[length-1]*nums[length-2]*nums[length-3]))
return int(res)
}
func main(){
var nums = []int{-11,-12,3,4,5,6}
fmt.Println(find3MaxProduct(nums))
}
线性扫描
- 全是正数或全是负数,则nums[length-1]*nums[length-2]*nums[length-3]
- 有负数有正数,则要么是nums[length-1]*nums[length-2]*nums[length-3],要么是nums[0]*nums[1]*nums[length-1]
func find3MaxProduct2(nums []int)int{
var min1 = math.MaxInt64
var min2 = math.MaxInt64
var max1 = math.MinInt64
var max2 = math.MinInt64
var max3 = math.MinInt64
for _, v := range nums{
if v <min1{
min2 = min1
min1 = v
}else if v<min2{
min2 = v
}
if v>max1{
max3 = max2
max2 = max1
max1 = v
}else if v>max2{
max3 = max2
max2 = v
}else if v>max3{
max3 = v
}
}
res := math.Max(float64(min1*min2*max1),
float64(max1*max2*max3))
return int(res)
}
本文参考链接:https://www.cnblogs.com/pangqianjin/p/14629082.html