返回

LeetCode 刷题实战:勘破有效正方形的奥秘,解题思路一目了然

闲谈

在算法学习的道路上,刷题是一个必不可少的过程。LeetCode 作为程序员的刷题圣地,汇聚了众多经典算法题目,为我们提供了绝佳的学习平台。而今天,我们将把目光聚焦在 LeetCode 中的一道有趣题目——有效正方形。

有效正方形的题干如下:

给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。
一个点的坐标(x,y)由一个有两个整数的整数数组表示。

乍一看,这道题似乎有些烧脑,但只要我们理清思路,掌握关键点,就能轻松攻克难关。下面,我们就一步步拆解题干,揭示解决问题的核心要领:

1. 理解题意,明确目标

首先,我们需要理解题意,明确题目要求。题干要求我们判断给定的四点是否可以构造一个正方形。这里需要注意的是,正方形是一个具有四个相等边和四个直角的四边形。因此,我们要判断四点是否可以构成一个正方形,就需要考察以下几个关键点:

  • 四边相等:四点的两两距离必须相等。
  • 直角:四点的两两边之间的夹角必须为 90 度。

2. 构建思路,巧妙解题

理清题意后,我们就可以开始构建解题思路了。这里,我们可以采用以下步骤来解决问题:

  1. 计算四点的两两距离,并存储在数组中。
  2. 检查数组中的距离是否都相等。如果相等,则说明四边相等。
  3. 计算四点两两边之间的夹角,并存储在数组中。
  4. 检查数组中的夹角是否都为 90 度。如果都为 90 度,则说明四点可以构成一个正方形。

3. 代码实现,验证思路

掌握了解题思路后,我们就可以将其转化为代码来实现。这里,我们可以使用 Python 作为编程语言,因为 Python 具有丰富的库和简洁的语法,非常适合算法实现。以下是 Python 代码的实现:

import math

def is_valid_square(points):
  """
  判断给定的四点是否可以构成一个正方形。

  参数:
    points:一个二维数组,存储四个点的坐标。

  返回值:
    一个布尔值,表示四点是否可以构成一个正方形。
  """

  # 检查点的数量是否为 4
  if len(points) != 4:
    return False

  # 计算四点的两两距离
  distances = []
  for i in range(4):
    for j in range(i + 1, 4):
      distance = math.sqrt((points[i][0] - points[j][0]) ** 2 + (points[i][1] - points[j][1]) **  2)
      distances.append(distance)

  # 检查四边是否相等
  if len(set(distances)) != 1:
    return False

  # 计算四点两两边之间的夹角
  angles = []
  for i in range(4):
    for j in range(i + 1, 4):
      angle = math.acos((points[i][0] - points[j][0]) * (points[(i + 1) % 4][0] - points[j][0]) +
                       (points[i][1] - points[j][1]) * (points[(i + 1) % 4][1] - points[j][1])) / distances[i] / distances[(i + 1) % 4]
      angles.append(angle)

  # 检查四角是否都为 90 度
  if len(set(angles)) != 1 or angles[0] != math.pi / 2:
    return False

  return True


# 测试用例
points1 = [[0, 0], [1, 1], [1, 0], [0, 1]]
print(is_valid_square(points1))  # True

points2 = [[0, 0], [1, 1], [2, 2], [3, 3]]
print(is_valid_square(points2))  # False

通过运行这段代码,我们可以验证我们的解题思路是正确的。对于给定的四点坐标,程序会正确判断它们是否可以构成一个正方形。

4. 总结提升,融会贯通

通过对有效正方形这道题的学习,我们不仅掌握了解决问题的方法,也锻炼了我们的算法思维和编程能力。在今后的学习和工作中,我们可以将这些经验应用到其他问题的解决中,不断提升自己的算法水平。