技术需求:统计数组中两个零之间包含负数的子集数量
数组子集统计:海平面下坡次数统计
问题背景
这个需求类比成「海平面上下坡统计」确实很直观,咱们先把需求拆解清楚:你需要统计数组中位于两个0之间且包含负数的子集数量,其中0代表海平面,正数序列对应上坡、负数序列对应下坡,每次行程必须从海平面出发,回到海平面后才能开启下一次。
明确规则
- 元素定义:
0= 海平面,正数 = 上坡步数,负数 = 下坡步数 - 子集划分:每个子集以
0开头,到下一个0结束(包含开头的0和两个0之间的所有元素),每个子集对应一次完整的上坡/下坡行程 - 统计目标:仅计数包含负数的子集(即下坡行程)的数量
核心实现思路
- 遍历数组,跟踪当前是否处于一个有效子段(已遇到开头的
0,还未遇到结尾的0) - 在子段内记录是否出现过负数
- 每当遇到结尾的
0时,检查当前子段是否包含负数,若是则计数加1,随后重置子段状态
代码示例(Python)
def count_downhill_subsets(arr): downhill_count = 0 in_segment = False has_negative = False for num in arr: if num == 0: if in_segment: # 结束当前子段,判断是否为下坡行程 if has_negative: downhill_count += 1 # 重置子段状态 has_negative = False # 开启新的子段 in_segment = True else: if in_segment: # 子段内检测负数 if num < 0: has_negative = True return downhill_count
代码逻辑解释
in_segment:标记是否处于一个有效的子段(从遇到第一个0开始,到下一个0结束)has_negative:记录当前子段是否出现过负数- 遍历过程中:
- 遇到
0时,如果已经在子段内,就结束当前子段并判断是否计数;同时开启新的子段 - 遇到非
0元素时,如果处于子段内,检查是否为负数并更新标记
- 遇到
示例验证
示例1
输入:a = [0,1,0,-1,-2,-1,0]
- 分割出的子段:
[0,1,0]、[0,-1,-2,-1,0] - 第一个子段无负数,第二个子段包含负数,最终输出
1,符合预期
示例2
输入:b = [0,1,2,1,0,-1,-2,-1,0,1,2,1,0,-1,0]
- 分割出的子段:
[0,1,2,1,0]、[0,-1,-2,-1,0]、[0,1,2,1,0]、[0,-1,0] - 符合条件的是后两个子段,最终输出
2,符合预期
内容的提问来源于stack exchange,提问作者Rahul Kewalramani
相关产品推荐
相关产品推荐

