PHP 乘积最大子数组 - LeetCode 152

195 阅读2分钟

「这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

今天说一下乘积最大子数组

image.png

实现思路

我们之前说过三数之和、四数之和的解法,题目要求是任意的三个数或者四个数,所以我们可以把数组排序后再进行查找。

但是今天这个乘积最大子数组是按照数组原本的顺序进行查找的。并不能先排序。

那么我们这个题目有什么难点呢?如果数组中全部都是正整数,那么整个数组就是乘积最大子数组。

但是如果数组中出现负数,那么就需要看数组的负数的个数了。因为我们都知道一个基本的常识,负负得正。两个负数相乘,得到的是一个正数。

在计算过程中,如果遇到一个负数,那么之前的乘积是一个正整数的话,相乘之后就会变成一个负整数;之前的数是一个负整数的话,相乘之后就会变成一个正整数。

也就是说,在查找乘积最大子数组的过程中,当前情况下的最大值或者最小值,会因为遇到一个负数而发生转变。

所以我们需要保存一个最大值和一个最小值,并在遍历中不断更新这两个数值。保存最小值就是为了在遇到负数时,发生改变,变成了最大值,而最大值与负数相乘变成了最小值。

完整代码

image.png

第757-758行代码,获取数组长度,如果数组为空或者只有一个元素则退出。

第760行代码,定义三个变量,最后的结果值、临时的最大值、临时最小值,均为数组的第一个元素值。

第762-768代码,遍历数组过程,数组从下标1开始遍历,也就是第二个元素,因为第一个元素已经付给了初始值。

第763-764行代码,定义到上一个元素为止的最大值和最小值,与当前元素相乘后的结果。得到当前最大值和当前最小值。

第765行代码,当前最大值,当前最小值,当前元素中取最大值重复赋值给变量$max

第766行代码,当前最大值,当前最小值,当前元素中取最小值重复赋值给变量$min

第767行代码,把当前最大值和到上一元素为止的最大值比较,取最大值重新赋值给变量$result。这个值即为多次遍历后的最终结果。

第770行代码,返回结果$result

代码比较少,但是有点绕,想明白了还是比较简单的。