数组的遍历 -【628】 三个数的最大乘积

4.【628】三个数的最大乘积

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积

示例 1:

输入:nums = [1,2,3]

输出:6

示例 2:

输入:nums = [1,2,3,4]

输出:24

示例 3:

输入:nums = [-1,-2,-3]

输出:-6

思路:

        我们知道由于数组nums中可能存在负数,也可能存在正数。即可能都是正数的数组、可能是都是负数的数组、可能是正数和负数并存的数组。那么我们知道假设都是正数,那么三个数的最大乘积就是从小到大排序后的最后三位的乘积,即nums[len-1]*nums[len-2]*nums[len-3],又或者nums都是负数的话,最大的三个乘积也是这最后三位的乘积。那么还有一种就是有正有负的数组,这种可能的最大乘积就是两个最小负数相乘再成一个最大正数,即nums[0]*nums[1]*nums[len-1]。那么我们知道了这两种可能的最大乘积的位置,我们只要先对数组进行排序,然后取这两种的最大值就可以了啊。即 return max(第一种,第二种)。

/*
1.首先将数组排序。
2.如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。
3.如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
4.综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。
*/
func maximumProduct(nums []int) int {
    sort.Ints(nums)
    n := len(nums)
    return max( nums[n-3]*nums[n-2]*nums[n-1],nums[0]*nums[1]*nums[n-1])
}

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

数组的遍历在分类刷题里就这四道。下面进行小结一下:

数据的遍历-小结

        1、在 最大连续1的个数, 我们知道在遍历的时候,每次见到1我们就count++,然后存放进res中,一旦nums[i] 不等于 1的时候,我们就把count清0,因为我们知道count这个是用来记录连续的1的。然后每次把count存放进res的时候记得要在res和count取最大值。这样才能确保res是最新的最大连续1的个数。第二种解法就是滑动窗口,保证窗口内的数组值是1就行,注意left和right的位置、以及left及时更新为right、以及获取窗口的大小。

        2、在提莫攻击这题里面,要清楚知道duration中毒时间和攻击时间的联系,当两次攻击之间的间隔时间少于等于duration的时候,中毒时间总和sum = duration + 第二次攻击时间 - 第一次攻击时间。当两次攻击之间的间隔时间大于duration的时候,那么中毒时间总和sum = duration + duration。不管怎么样都会有一个duration的,所以我们把sum初始化为duration了,每次就是sum += xxx了。或者说我们统计的是第i-1个,所以别忘记加上一个duration吧。

        3、在第三大的数这道题中,我们知道可以对数组先进行排序,但是由于数组nums中可能有重复的数字,所以对排序完的数组进行遍历的时候,当nums[i] != nums[i-1]的时候,用计数count++。当count == 3的时候,第三大的数字已经出来了。唯一要注意的是使用sort.Ints(nums)排序的是从小到达,所以你在遍历的时候应该是从后面往前面遍历的。还有count可能初始化为1,然后返回的可能是nums[i-1]。然后i可能是从len(nums)-1开始遍历,从i=1结束。因为每次遍历都要i和i-1的下标,所以i最多到1,不能是0。

        4、在三个数的最大乘积这道题目里,我们知道由于数组nums中可能存在负数,也可能存在正数。即可能都是正数的数组、可能是都是负数的数组、可能是正数和负数并存的数组。那么我们知道假设都是正数,那么三个数的最大乘积就是从小到大排序后的最后三位的乘积,即nums[len-1]*nums[len-2]*nums[len-3],又或者nums都是负数的话,最大的三个乘积也是这最后三位的乘积。那么还有一种就是有正有负的数组,这种可能的最大乘积就是两个最小负数相乘再成一个最大正数,即nums[0]*nums[1]*nums[len-1]。那么我们知道了这两种可能的最大乘积的位置,我们只要先对数组进行排序,然后取这两种的最大值就可以了啊。即 return max(第一种,第二种)。

        5、下面我们将进入  统计数组中的元素  一共有6道。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值