返回

从Offer导出的LeetCode题:挑战1944,让你对数据统计有更深的了解

后端

前言

Offer是众多技术面试者都会选择的一款题目,它以其独有的技术面试问题设计,帮助面试者迅速了解LeetCode的解题思路,为技术面试做好充分的准备。掘友们可以利用2022春招系列活动-刷题打卡任务的机会,积极参与LeetCode的刷题打卡,通过完成不同难度的LeetCode题目,快速提升自己的技术水平,为未来的技术面试做好充分的准备。

任务挑战:

题目:

问题

给定一排人的身高,求每个人往右边看过去,能看到多少人? 能看到对方,当且仅当两个人中间的所有人都比这两个更矮。

示例:

输入:[1, 2, 3, 4, 5]
输出:[0, 1, 2, 3, 4]

解释:

第五个人可以看到前面四个人。
第四个人可以看到前面三个人。
第三个人可以看到前面两个人。
第二个人可以看到前面一个人。
第一个人看不到任何人。

提示:

  • 1 <= heights.length <= 100
  • 1 <= heights[i] <= 100

解题思路:

这道题可以用动态规划来解决。我们可以定义一个数组dp,其中dp[i]表示第i个人能看到的人数。我们从左到右遍历数组,对于第i个人,我们比较他与前面所有人的身高,如果前面某个人的身高比他高,那么第i个人就不能看到他,否则第i个人可以看到他。这样,我们就可以得到dp[i]的值。

Python代码:

def count_visible_people(heights):
  """
  求每个人往右边看过去,能看到多少人。

  参数:
    heights: 一排人的身高,是一个整数列表。

  返回:
    一个整数列表,表示每个人能看到的人数。
  """

  # 定义一个数组dp,其中dp[i]表示第i个人能看到的人数
  dp = [0] * len(heights)

  # 从左到右遍历数组
  for i in range(1, len(heights)):
    # 比较第i个人与前面所有人的身高
    for j in range(i):
      # 如果前面某个人的身高比他高,那么第i个人就不能看到他
      if heights[j] >= heights[i]:
        break
      # 否则,第i个人可以看到他
      dp[i] += 1

  # 返回dp数组
  return dp


# 测试
heights = [1, 2, 3, 4, 5]
print(count_visible_people(heights))

输出:

[0, 1, 2, 3, 4]