【剑指offer】连续子数组的最大乘积 [Go语言]

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

描述

输入一个长度为 n 的整型数组 nums,数组中的一个或连续多个整数组成一个子数组。求所有子数组的乘积的最大值。

1.子数组是连续的,且最小长度为 1 ,最大长度为 n

2.长度为 1 的子数组,乘积视为其本身,比如 [4] 的乘积为 4

3.该题的数据保证最大的乘积不会超过 int 的范围,即不超过2^32-1

输入描述:

第一行输入一个正整数 n ,表示数组的长度

第二行输入 n 个整数,表示数组中的值。

输出描述:

输出子数组的乘积的最大值

示例1

输入:

4
3 2 -2 4
复制代码

输出:

6
复制代码

说明:

子数组[3,2]的乘积为6,[3,2,-1,4]的乘积为-24,[4]的乘积为4,故返回6
复制代码

示例2

输入:

3
-3 0 -2
复制代码

输出:

0
复制代码

说明:

因为0在中间,所有包含0的子数组的乘积都为0,另外的数都是负数,所以最大乘积的子数组为[0],返回为0,因为子数组要求是连续的,所以[-3,-2]不是[-3,0,-2]的子数组,所以不能为6,
复制代码

AC Code

package main

import "fmt"

func main(){
    var n int
    fmt.Scan(&n)
    nums := make([]int,n)
    for i:=0;i<n;i++{
        fmt.Scan(&nums[i])
    }
(1)    pre_max,pre_min := nums[0],nums[0]
(2)    var tmp_max,tmp_min int
(3)    var res int = nums[0]
(4)    for i:=1;i<n;i++ {
(5)        tmp_max , tmp_min = pre_max*nums[i],pre_min*nums[i]
(6)        pre_max = max(max(tmp_max,tmp_min), nums[i])
(7)        pre_min = min(min(tmp_max,tmp_min), nums[i])
(8)        res = max(res,pre_max)
    }
    fmt.Println(res)
}

(9)func max(a,b int) int{
    if a>b{
        return a
    }
    return b
}

(10)func min(a,b int) int{
    if a>b{
        return b
    }
    return a
}
复制代码
  • (1) 最大和最小值的当前值,初始化最大最小
  • (2) 定义临时的最大最小值
  • (3) 先让结果等于列表中的第一个值作为初始化
  • (4) 循环遍历
  • (5) 让临时的最大值和最小值等于当前的最大值和最小值乘以nums[i]
  • (6) 那么让这个pre_max = 然后取tmp_min和tmp_max中的最大值,再和num[i]比的最大值
  • (7) 同样的取最小值,因为可能会是负号,所以会用这种形式进行
  • (8) 最终结果就从上一次的结果和目前的最大值取一个最大的
  • (9) 获取最大值函数
  • (10) 获取最小值函数

猜你喜欢

转载自juejin.im/post/7077822603926175752