iOS Swift - Leetcode 1567.具有正积的子数组的最大长度

问题描述 投票:0回答:1

我正在查看下面的解决方案,并花了很多时间试图理解它为什么有效,但无法弄清楚。假设我的理解是正确的,f1存储正数的最大长度,f2存储负数的最大长度,为什么当数字为负且f2也为零时f1重置为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
        }
}

阅读这篇文章,但它没有解释为什么 f1 重置为零。提前非常感谢您:https://algo.monster/liteproblems/1567

swift algorithm dynamic-programming sliding-window
1个回答
0
投票

假设我的理解是正确的,f1存储正数的最大长度,f2存储负数的最大长度

你的这个理解并不完全正确。在您提供的代码中 -

f1 表示以正积结束于当前位置的子数组的长度,f2(如果非零)表示以负积结束于当前位置的子数组的长度。


现在,回答你的问题:

为什么当数字为负数且f2也为零时,f1重置为0?

f2 = 0 表示以负乘积结束于当前位置的子数组的长度为 0,这意味着当前索引之前没有任何负数。当当前索引为负数时,如果之前存在任何负数,则只有可能使乘积为正数,而 f2=0 时情况并非如此,因此不可能获得以当前索引结尾的子数组具有正积的指数。这就是为什么 f1 变成 0。

© www.soinside.com 2019 - 2024. All rights reserved.