Skip to main content
 首页 » 编程设计

Go语言三个数的最大乘积

2022年08月18日145linjiqin

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