三个数的最大乘积-基于Go

整形数组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