C#版 - Leetcode 593. 有效的正方形 - 题解

时间:2023-12-25 17:35:49

版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址

http://blog.csdn.net/lzuacm

C#版 - Leetcode 593. 有效的正方形 - 题解

Leetcode 593. Valid Square

在线提交:

https://leetcode.com/problems/valid-square/

题目描述


给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。

一个点的坐标(x, y)由一个有两个整数的整数数组表示。

示例 1:

输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]

输出: True

Case 2:

输入:

  [ 0, 0 ]
  [ 0, 0 ]
  [ 0, 0 ]
  [ 0, 0 ]

输出:

False

Case 3:

输入:

  [ 1, 1 ]
  [ 0, 1 ]
  [ 1, 2 ]
  [ 0, 0 ]

输出:

False

注意:

  1. 所有输入整数都在 [-10000,10000] 范围内。
  2. 一个有效的正方形有四个等长的正长和四个等角(90度角)。
  3. 输入点没有顺序。

  ●  题目难度: Medium
  • 通过次数:164
  • 提交次数:484
  • 贡献者:fallcreek

  • 相关话题 数学


思路:

临界情况: 4个输入的点中有两个或多个相同,直接返回false。

方法1: 利用坐标系,向量长度和向量点乘来判断~

如果是复杂的向量、矩阵运算,还可使用开源的.net库mathnet,

C#中使用mathnet学习笔记(二) - 冰呆瓜 - 博客园

已AC代码:

using System.Collections.Generic;
using System.Linq;

namespace Leetcode539_ValidSquare
{
    public class Solution
    {
        public bool ValidSquare(int[] p1, int[] p2, int[] p3, int[] p4)
        {
            int[] vect1 = { p2[0] - p1[0], p2[1] - p1[1] };
            int[] vect2 = { p4[0] - p1[0], p4[1] - p1[1] };
            int[] vect3 = { p3[0] - p1[0], p3[1] - p1[1] };
            List<int[]> vects = new List<int[]> { vect1, vect2, vect3 };

            if (vects.Any(x => x.SequenceEqual(new[]{0, 0}))) // 输入的点中存在相同的
                return false;

            List<int> lenSquaresFromP1 = new List<int> { GetLenSquare(p2, p1), GetLenSquare(p4, p1), GetLenSquare(p3, p1) };
            List<int> extraLenSquares = new List<int> { GetLenSquare(p2, p3), GetLenSquare(p2, p4), GetLenSquare(p3, p4) };

            if (lenSquaresFromP1.Max() != extraLenSquares.Max())
                return false; // 当从p1出发的最长距离不为所有点两两之间距离的最大值时,只是菱形,不是正方形

            var maxLenSquare = lenSquaresFromP1.Max(); // 后面要remove, 此处作备份
            int maxPos = lenSquaresFromP1.IndexOf(maxLenSquare);
            lenSquaresFromP1.RemoveAt(maxPos);
            vects.RemoveAt(maxPos);

            if (lenSquaresFromP1[0] == lenSquaresFromP1[1] && lenSquaresFromP1[0] * 2 == maxLenSquare &&
                VectorCross(vects[0], vects[1]) == 0)
                return true;

            return false;
        }

        private int VectorCross(int[] vect1, int[] vect2) => vect1[0] * vect2[0] +
                                                             vect1[1] * vect2[1];

        private int GetLenSquare(int[] point1, int[] point2) => (point2[0] - point1[0]) * (point2[0] - point1[0]) +
                                                             (point2[1] - point1[1]) * (point2[1] - point1[1]);
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 以下为test
            Solution sol = new Solution();
            //int[] p1 = { 0, 0 };
            //int[] p2 = { 0, 0 };
            //int[] p3 = { 0, 0 };
            //int[] p4 = { 0, 0 };

            //int[] p1 = { 1, 1 };
            //int[] p2 = { 0, 1 };
            //int[] p3 = { 1, 2 };
            //int[] p4 = { 0, 0 };
            int[] p1 = { 0, 0 };
            int[] p2 = { 1, 1 };
            int[] p3 = { 1, 0 };
            int[] p4 = { 0, 1 };
            bool result = sol.ValidSquare(p1, p2, p3, p4);
        }
    }
}

Rank:

You are here! Your runtime beats 30.77% of csharp submissions.

方法2: 判断4条边完全相等。

已AC代码:

public class Solution
{
    public bool ValidSquare(int[] p1, int[] p2, int[] p3, int[] p4)
    {
        if (GetLenSquare(p1, p2) == 0 || GetLenSquare(p2, p3) == 0 || GetLenSquare(p3, p4) == 0 || GetLenSquare(p1, p4) == 0)
            return false;

        return GetLenSquare(p1, p2) == GetLenSquare(p3, p4) && GetLenSquare(p1, p3) == GetLenSquare(p2, p4) && GetLenSquare(p1, p4) == GetLenSquare(p2, p3) &&
               (GetLenSquare(p1, p2) == GetLenSquare(p1, p3) || GetLenSquare(p1, p2) == GetLenSquare(p1, p4) || GetLenSquare(p1, p3) == GetLenSquare(p1, p4));
    }

    private int GetLenSquare(int[] point1, int[] point2) => (point2[0] - point1[0]) * (point2[0] - point1[0]) +
                                                         (point2[1] - point1[1]) * (point2[1] - point1[1]);
}

Rank:

You are here! Your runtime beats 69.23% of csharp submissions.