今天又是遇到一道很有趣的题目,题目并不难,主要考虑的比较多,闲话少叙,进入正题。
低洼地 —— 题目描述
一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?
如图:地高变化为 。
输入格式
两行,第一行 n ,表示有 n 个数。第二行连续 n 个数表示地平线高度变化的数据,保证首尾为0。
。
输出格式
一个数,可能积水低洼地的数目。
样例
样例输入
10
0 1 0 2 1 2 0 0 2 0
样例输出
3
题目总的来说浅显易懂,就是要计算这些山峰之间有多少个洼地。
洼地的特征就是中间低,两边高,对应到题目中就是:两个较大的数之间夹着一个较小的数。这个就是解决本题的基本点。
在思考的过程中发现这个点可以更加简化,只要是有存在上下坡的变化时就可能存在洼地。上坡:数值变大,下坡:数值变小。在下坡变化到上坡时必定会存在洼地。所以要设置一个上下坡的状态(代码中用 status 表示),以及两个高度(一个保存上一次的高度——last ,另一个保存当前输入的高度——height)来辅助判断。
在第一次提交测试的时候忽视了—— 平地(高度不变),于是我开始思考,高度不变的情况又可以延伸为四种:
- 上 ——>平 ——>上
- 下 ——>平 ——>下
- 上 ——>平 ——>下
- 下 ——>平 ——>上
很明显的看到只有 : 下 ——>平 ——>上 这一种可能性才会形成洼地。并且,对于前三种情况来说,中间的平地并不影响上升或者下降的趋势,所以将 平地 —— 归于前一种上下坡的状态。
运行代码
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), height, last = 0, count = 0, status = 0;
// 初始状态为平地。
// status——状态: -1 —— 下坡,0 —— 平地, 1 —— 上坡
// last——上一次的高度,height——当前高度
for (int i = 0; i < n; i++) {
//输入高度
height = sc.nextInt();
// 洼地判断:
// 如果当前状态(上一次状态)为下坡,且当前的高度 > 上一次的高度 (height > last)
// 满足上述条件则必定存在洼地
if (height > last && status == -1) {
count++;
}
// 平地情况,将平地状态转换为上一次上下坡的状态
if (height == last) {
// 上一次是下坡就转换为下坡
if (status == -1)
status = -1;
// 上一次是上坡就转换为上坡
if (status == 1)
status = 1;
} else if (height > last)// 高度自然上升情况
status = 1;
else// 高度自然下降情况
status = -1;
last = height;
}
System.out.println(count);
}
}
到此就分享完了,如果小伙伴有更好的方法也可以评论,一起加油!