版权声明: 本文为博主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:

输入:

  1. [ 0, 0 ]
  2. [ 0, 0 ]
  3. [ 0, 0 ]
  4. [ 0, 0 ]

输出:

False

Case 3:

输入:

  1. [ 1, 1 ]
  2. [ 0, 1 ]
  3. [ 1, 2 ]
  4. [ 0, 0 ]

输出:

False

注意:

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

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

  • 相关话题 数学


思路:

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

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

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

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

已AC代码:

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. namespace Leetcode539_ValidSquare
  4. {
  5. public class Solution
  6. {
  7. public bool ValidSquare(int[] p1, int[] p2, int[] p3, int[] p4)
  8. {
  9. int[] vect1 = { p2[0] - p1[0], p2[1] - p1[1] };
  10. int[] vect2 = { p4[0] - p1[0], p4[1] - p1[1] };
  11. int[] vect3 = { p3[0] - p1[0], p3[1] - p1[1] };
  12. List<int[]> vects = new List<int[]> { vect1, vect2, vect3 };
  13. if (vects.Any(x => x.SequenceEqual(new[]{0, 0}))) // 输入的点中存在相同的
  14. return false;
  15. List<int> lenSquaresFromP1 = new List<int> { GetLenSquare(p2, p1), GetLenSquare(p4, p1), GetLenSquare(p3, p1) };
  16. List<int> extraLenSquares = new List<int> { GetLenSquare(p2, p3), GetLenSquare(p2, p4), GetLenSquare(p3, p4) };
  17. if (lenSquaresFromP1.Max() != extraLenSquares.Max())
  18. return false; // 当从p1出发的最长距离不为所有点两两之间距离的最大值时,只是菱形,不是正方形
  19. var maxLenSquare = lenSquaresFromP1.Max(); // 后面要remove, 此处作备份
  20. int maxPos = lenSquaresFromP1.IndexOf(maxLenSquare);
  21. lenSquaresFromP1.RemoveAt(maxPos);
  22. vects.RemoveAt(maxPos);
  23. if (lenSquaresFromP1[0] == lenSquaresFromP1[1] && lenSquaresFromP1[0] * 2 == maxLenSquare &&
  24. VectorCross(vects[0], vects[1]) == 0)
  25. return true;
  26. return false;
  27. }
  28. private int VectorCross(int[] vect1, int[] vect2) => vect1[0] * vect2[0] +
  29. vect1[1] * vect2[1];
  30. private int GetLenSquare(int[] point1, int[] point2) => (point2[0] - point1[0]) * (point2[0] - point1[0]) +
  31. (point2[1] - point1[1]) * (point2[1] - point1[1]);
  32. }
  33. class Program
  34. {
  35. static void Main(string[] args)
  36. {
  37. // 以下为test
  38. Solution sol = new Solution();
  39. //int[] p1 = { 0, 0 };
  40. //int[] p2 = { 0, 0 };
  41. //int[] p3 = { 0, 0 };
  42. //int[] p4 = { 0, 0 };
  43. //int[] p1 = { 1, 1 };
  44. //int[] p2 = { 0, 1 };
  45. //int[] p3 = { 1, 2 };
  46. //int[] p4 = { 0, 0 };
  47. int[] p1 = { 0, 0 };
  48. int[] p2 = { 1, 1 };
  49. int[] p3 = { 1, 0 };
  50. int[] p4 = { 0, 1 };
  51. bool result = sol.ValidSquare(p1, p2, p3, p4);
  52. }
  53. }
  54. }

Rank:

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

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

已AC代码:

  1. public class Solution
  2. {
  3. public bool ValidSquare(int[] p1, int[] p2, int[] p3, int[] p4)
  4. {
  5. if (GetLenSquare(p1, p2) == 0 || GetLenSquare(p2, p3) == 0 || GetLenSquare(p3, p4) == 0 || GetLenSquare(p1, p4) == 0)
  6. return false;
  7. return GetLenSquare(p1, p2) == GetLenSquare(p3, p4) && GetLenSquare(p1, p3) == GetLenSquare(p2, p4) && GetLenSquare(p1, p4) == GetLenSquare(p2, p3) &&
  8. (GetLenSquare(p1, p2) == GetLenSquare(p1, p3) || GetLenSquare(p1, p2) == GetLenSquare(p1, p4) || GetLenSquare(p1, p3) == GetLenSquare(p1, p4));
  9. }
  10. private int GetLenSquare(int[] point1, int[] point2) => (point2[0] - point1[0]) * (point2[0] - point1[0]) +
  11. (point2[1] - point1[1]) * (point2[1] - point1[1]);
  12. }

Rank:

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

C#版 - Leetcode 593. 有效的正方形 - 题解的更多相关文章

  1. C#版 - Leetcode 13. 罗马数字转整数 - 题解

    C#版 - Leetcode 13. 罗马数字转整数 - 题解 Leetcode 13. Roman to Integer 在线提交: https://leetcode.com/problems/ro ...

  2. C#版 - Leetcode 633. 平方数之和 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  3. C#版 - Leetcode 414. Third Maximum Number题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  4. LeetCode 593. 有效的正方形(向量做法)

    题目 题目链接:593. 有效的正方形 题意:给出二维平面上四个点的坐标,判断这四个点是否能构成一个正方形,四个点的输入顺序不做任何保证. 思路 通过向量运算可以很轻松地解决这道题.任取一点向其他三点 ...

  5. Java实现 LeetCode 593 有效的正方形(判断正方形)

    593. 有效的正方形 给定二维空间中四点的坐标,返回四点是否可以构造一个正方形. 一个点的坐标(x,y)由一个有两个整数的整数数组表示. 示例: 输入: p1 = [0,0], p2 = [1,1] ...

  6. C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  7. C#刷遍Leetcode面试题系列连载(5):No.593 - 有效的正方形

    上一篇 LeetCode 面试题中,我们分析了一道难度为 Easy 的数学题 - 自除数,提供了两种方法.今天我们来分析一道难度为 Medium 的面试题. 今天要给大家分析的面试题是 LeetCod ...

  8. C#版 - Leetcode 504. 七进制数 - 题解

    C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...

  9. C#版 - Leetcode 306. 累加数 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

随机推荐

  1. java无需解压zip压缩包直接读取包内的文件名(含中文)

    java自带了java.util.zip工具可以实现在不解压zip压缩包的情况下读取包内文件的文件名:(注:只能是ZIP格式的,rar我试了不行)代码如下: public static String ...

  2. BigDecimal.valueOf

    Those are two separate questions: "What should I use for BigDecimal?" and "What do I ...

  3. Emgucv使用中常用函数总结

    Emgucv常用函数总结: 读取图片 Mat SCr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor); //根据路径创建指定的 ...

  4. FlashFXP用到的功能

    FlashFXP目前用到的个人理解就是: 一个公共空间  大家同时连接进来可以共享文件进去(该软件支持从屏幕上直接拖拽文件进来) 这里面页面之类的可以用手机进行访问(有利于调试) 第一步接收师哥给的软 ...

  5. C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装

    修改自网路 CommonTools.h /* * CommonTools.h * * Created on: 2018年8月2日 * Author: didi */ #include <iost ...

  6. 计算机硬件&操作系统

    一.计算机的硬件: 控制器:计算机的指挥系统 运算器:数学运算+逻辑运算 存储器I/O设备:存I取O数据   内存(内存条):短期记忆,速度快,但是断电数据会丢失:   外存(硬盘):永久记忆,速度非 ...

  7. 我的 FPGA 学习历程(11)—— 实验:按键消抖

    按键是一个输入设备,在理论上可以归为开关一类,理想的按键波形如下: 然而由于按键的机械特性,断开和闭合动作是不可能在一瞬间完成的,实际的波形如下: 抖动期间电平处于临界值,由于晶振的频率相当的高,数字 ...

  8. Flume+Kafka+Storm整合

    Flume+Kafka+Storm整合 1. 需求: 有一个客户端Client可以产生日志信息,我们需要通过Flume获取日志信息,再把该日志信息放入到Kafka的一个Topic:flume-to-k ...

  9. 纯css修改单选、复选按钮样式

    只支持IE9及以上 html <label><input class="radio" type="radio" name="radi ...

  10. [LeetCode] Hand of Straights 一手顺子牌

    Alice has a hand of cards, given as an array of integers. Now she wants to rearrange the cards into ...