LeetCode 593. 有效的正方形

题目描述

593. 有效的正方形

思路分析

解法一:距离平方判定(推荐)

核心思路

  • 计算 4 个点两两之间的平方距离,共 6 个值。
  • 若是正方形,应满足:
    • 4 条边长度相等且 > 0;
    • 2 条对角线长度相等,且是边长的 2 倍。


复杂度分析

  • 时间复杂度:O(1),固定 6 次计算。
  • 空间复杂度:O(1)。
import java.util.Arrays;

class Solution {
    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        long[] d = new long[6];
        int[][] pts = {p1, p2, p3, p4};
        int idx = 0;
        for (int i = 0; i < 4; i++) {
            for (int j = i + 1; j < 4; j++) {
                d[idx++] = dist2(pts[i], pts[j]);
            }
        }
        Arrays.sort(d);

        return d[0] > 0
                && d[0] == d[1] && d[1] == d[2] && d[2] == d[3]
                && d[4] == d[5]
                && d[4] == 2 * d[0];
    }

    private long dist2(int[] a, int[] b) {
        long dx = a[0] - b[0];
        long dy = a[1] - b[1];
        return dx * dx + dy * dy;
    }
}
import "sort"

func validSquare(p1 []int, p2 []int, p3 []int, p4 []int) bool {
	pts := [][]int{p1, p2, p3, p4}
	d := make([]int, 0, 6)

	for i := 0; i < 4; i++ {
		for j := i + 1; j < 4; j++ {
			d = append(d, dist2(pts[i], pts[j]))
		}
	}

	sort.Ints(d)
	return d[0] > 0 && d[0] == d[1] && d[1] == d[2] && d[2] == d[3] && d[4] == d[5] && d[4] == 2*d[0]
}

func dist2(a []int, b []int) int {
	dx := a[0] - b[0]
	dy := a[1] - b[1]
	return dx*dx + dy*dy
}

相似题目

题目 难度 考察点
593. 有效的正方形 中等 几何
149. 直线上最多的点数 困难 几何
223. 矩形面积 中等 几何
812. 最大三角形面积 简单 几何
463. 岛屿的周长 简单 几何/网格
939. 最小面积矩形 中等 几何
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/58606642
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!