LeetCode最大乘积子数组解法中`or 1`的作用解析请求
解析最大乘积子数组解法中的
or 1逻辑 一、代码整体工作原理
这段代码通过双向遍历的思路解决最大乘积子数组问题:
- 先将原数组
nums反转得到数组B - 分别对
nums做正向遍历、对B做反向遍历(等价于对原数组做反向遍历),计算以每个位置为结尾的连续子数组乘积 - 最后合并两个数组,取所有元素的最大值,这个值就是整个数组的最大乘积子数组的结果
二、nums[i] *= nums[i - 1] or 1中or 1的作用
这里的or 1是用来处理前一个位置的连续乘积为0的边界情况:
- 在Python的逻辑运算中,
or会返回第一个为"真"的元素。如果nums[i-1]的值是0(属于假值),nums[i-1] or 1就会返回1;如果nums[i-1]非0,就直接返回nums[i-1]本身。 - 举两个实际例子:
- 若数组是
[0, 3],正向遍历到第二个元素时,nums[0]是0,此时3 *= 0 or 1等价于3 * 1 = 3,相当于重新开始计算以3为起点的子数组乘积。 - 若数组是
[2, -3],遍历到第二个元素时,nums[0]是2(非0),则-3 *= 2得到-6,延续了前面的连续乘积计算。
- 若数组是
简单说,这个操作就是避免让当前元素乘0导致连续乘积被强制重置为0,而是在遇到前序乘积为0时,让当前元素从自身开始重新计算连续乘积。
三、为什么需要双向遍历?
因为数组中可能存在负数:单个负数会拉低乘积,但两个负数相乘会得到正数。仅做正向遍历可能会漏掉从后往前的最优连续子数组(比如数组[-3, -1, -1],正向遍历得到的数组是[-3, 3, -3],反向遍历得到的数组是[-1, 1, -3],合并后最大值是3,对应原数组中[-3, -1]或[-1, -1]这两个子数组的乘积)。双向遍历能覆盖所有可能的连续子数组组合,确保不会错过最优解。
内容的提问来源于stack exchange,提问作者Parth Sanghani
相关产品推荐
相关产品推荐

