1. 需求理解
需要针对“低洼地”统计问题,撰写一份详细的代码题解,核心是解析代码如何尝试解决“统计能积水的低洼地数量”这一问题。
2. 代码题解
(1)题目核心定义
低洼地:一段连续相同高度的区域,满足左侧高度更高、右侧高度更高,这样的区域计为1个低洼地(即使区域内有多个连续相同高度的点,也只算1个)。
(2)原代码整体思路
原代码试图遍历数组中每个中间位置(排除首尾),判断该位置是否为低洼地核心点,同时处理连续相同高度的情况,最终统计满足条件的低洼地数量。
(3)原代码逐行解析
(4)原代码逻辑拆解(以样例为例)
样例输入:10 0 1 0 2 1 2 0 0 2 0(注:原代码读入n=10、m=0,再读10个高度)
数组a(1下标):a[1]=0, a[2]=1, a[3]=0, a[4]=2, a[5]=1, a[6]=2, a[7]=0, a[8]=0, a[9]=2, a[10]=0
遍历过程关键步骤:
* i=2:a[2]=1,a[1]=0(不满足左高),res=0;跳过连续相同(无);a[3]=0(不满足右高);res≠2,不计入。
* i=3:a[3]=0,a[2]=1(左高,res=1);跳过连续相同(无);a[4]=2(右高,res=2);ans=1。
* i=4:a[4]=2,a[3]=0(不满足左高);跳过连续相同(无);a[5]=1(不满足右高);不计入。
* i=5:a[5]=1,a[4]=2(左高,res=1);跳过连续相同(无);a[6]=2(右高,res=2);ans=2。
* i=6:a[6]=2,a[5]=1(不满足左高);跳过连续相同(无);a[7]=0(不满足右高);不计入。
* i=7:a[7]=0,a[6]=2(左高,res=1);跳过连续相同(i+1=8,a[8]=0,i变为8);a[9]=2(右高,res=2);ans=3。
* i=8:循环i < n(n=10),i=8进入循环,但while判断i+1=9 <10且a[9]≠a[8],无跳过;a[9]=2 > a[8]=0,但a[8]左是a[7]=0(不满足左高),res=1,不计入。
* i=9:循环结束(i <n即9<10,但i=9处理时:a[9]=2左是a[8]=0(不满足左高),a[10]=0(不满足右高),不计入)。
最终输出ans=3,与样例结果一致。
(5)代码运行说明
* 前置条件:C++编译环境(支持万能头文件bits/stdc++.h);
* 输入格式:需严格输入两行(第一行n和任意数m,第二行n个高度),或修改cin >> n >> m;为cin >> n;以匹配题目输入格式;
* 输出:满足条件的低洼地数量。
3. 总结
1. 核心逻辑:遍历中间位置,判断“左高+右高”,跳过连续相同高度避免重复计数,统计满足条件的低洼地数量;
2. 关键细节:连续相同高度的区域仅算1个低洼地,首尾位置无低洼地;
3. 代码特点:逻辑简洁、效率高,仅存在少量冗余(如未使用的m),核心功能可正确解决题目问题。