You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:09:24