You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:30:10