LeetCode 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. 最小面积矩形 | 中等 | 几何 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!