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

iOS Swift实现Leetcode 1567:正乘积子数组最长长度代码疑问

关于LeetCode 1567题Swift解法中f1重置为0的逻辑解释

首先要明确两个变量的核心定义:

  • f1:以当前遍历到的元素结尾的正乘积子数组的最大长度(并非全局正乘积子数组的最大长度)
  • f2:以当前遍历到的元素结尾的负乘积子数组的最大长度(同理,并非全局的)

当遍历到负数时,正乘积和负乘积的转换逻辑是:

  1. 正乘积子数组只能由「之前的负乘积子数组 + 当前负数」得到(负负得正)
  2. 负乘积子数组只能由「之前的正乘积子数组 + 当前负数」得到(正负得负)

为什么遇到负数且f2=0时要把f1重置为0?

当f2=0,说明在当前负数之前,不存在以它前一个元素结尾的负乘积子数组。此时:

  • 无法通过「负乘积子数组 + 当前负数」得到正乘积子数组(因为根本没有这样的负乘积子数组)
  • 单个负数本身是负的,不能构成正乘积子数组

所以,以当前负数结尾的正乘积子数组是不存在的,自然要把f1置为0。

示例验证

举个简单例子:数组[3, -1]

  • 遍历到3时:f1=1(正乘积子数组[3]),f2=0(无负乘积子数组)
  • 遍历到-1时:
    • 因为f2=0,所以f1置为0(没有以-1结尾的正乘积子数组)
    • f2变为1+1=2(负乘积子数组[3, -1])
  • 最终结果取max(1, 0)=1,符合实际(最长正乘积子数组是[3])

再比如数组[-2]:

  • 遍历到-2时,f2=0,所以f1置为0,f2变为0+1=1
  • 结果是0,正确(没有正乘积子数组)

完整代码回顾

class Solution {
    func getMaxLen(_ nums: [Int]) -> Int {
        var f1 = 0
        var f2 = 0
        var result = 0
        for num in nums {
            if num > 0 {
                f1 += 1
                if f2 > 0 {
                    f2 += 1
                }
            } else if num < 0 {
                let temp = f1
                if f2 > 0 {
                    f1 = f2 + 1
                } else {
                   f1 = 0
                }
                f2 = temp + 1
            } else {
                f1 = 0
                f2 = 0
            }
            result = max(result, f1)
        }
        return result
    }
}

内容的提问来源于stack exchange,提问作者bubu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:16