Ruby金字塔可见计数问题:找到数组最大值后如何退出循环
Ruby金字塔可见性统计:遍历遇最大值终止循环实现
首先明确核心计数规则:从某一侧看金字塔,只有比当前方向上已经出现过的最高金字塔更高的塔才会被看到,一旦遍历到全局最高塔,后方所有塔都会被遮挡,无需继续遍历。
实现思路
- 提前计算一次数组全局最大值,避免遍历中重复计算
- 统计单方向可见数时,初始化可见数为1(第一个位置的塔一定可见),初始化当前已见最高值为起点位置的塔高
- 如果起点位置就是全局最高塔,直接得到该方向可见数为1,无需进入遍历
- 沿当前方向逐一遍历后续元素:
- 若当前元素比已见最高值更高,可见数+1,更新已见最高值
- 若已见最高值等于全局最大值,直接跳出循环,终止后续无意义遍历
- 左右两个方向复用同一套逻辑,仅遍历方向不同
修正后可运行代码
array = [4,5,1,2,3] max_height = array.max # 统计左侧可见数量 left = 1 current_max = array[0] unless current_max == max_height (1...array.length).each do |i| current = array[i] if current > current_max left += 1 current_max = current end break if current_max == max_height end end # 统计右侧可见数量 right = 1 current_max = array[-1] unless current_max == max_height (array.length - 2).downto(0) do |i| current = array[i] if current > current_max right += 1 current_max = current end break if current_max == max_height end end result = {left: left, right: right} puts result
逻辑验证
- 测试输入
[1,2,3,4,5]:左侧遍历到最高值5时累计计数5,触发跳出;右侧起点就是5,直接得到计数1,返回{left:5, right:1},符合预期 - 测试输入
[4,5,1,2,3]:左侧遍历到索引1的5时累计计数2,触发跳出;右侧反向遍历到索引1的5时累计计数2,触发跳出,返回{left:2, right:2},符合预期 - 相比原
each_cons+数组反转的实现,该写法避免了反转数组的额外开销,遇最大值即终止,遍历步数更少。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

