iOS Swift实现Leetcode 1567:正乘积子数组最长长度代码疑问
关于LeetCode 1567题Swift解法中f1重置为0的逻辑解释
首先要明确两个变量的核心定义:
f1:以当前遍历到的元素结尾的正乘积子数组的最大长度(并非全局正乘积子数组的最大长度)f2:以当前遍历到的元素结尾的负乘积子数组的最大长度(同理,并非全局的)
当遍历到负数时,正乘积和负乘积的转换逻辑是:
- 正乘积子数组只能由「之前的负乘积子数组 + 当前负数」得到(负负得正)
- 负乘积子数组只能由「之前的正乘积子数组 + 当前负数」得到(正负得负)
为什么遇到负数且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
相关产品推荐
相关产品推荐

