这是小川的第387次更新,第416篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第248题(顺位题号是1037)。回旋镖是一组各不相同且不在一条直线上的三个点。给出三个点的列表,判断这些点是否是回旋镖。

例如:

输入:[[1,1],[2,3],[3,2]]

输出:true

输入:[[1,1],[2,2],[3,3]]

输出:false

注意

  • points.length == 3

  • points[i].length == 2

  • 0 <= points[i][j] <= 100

02 第一种解法

要判断三个点是否能构成回旋镖,一是三个点各不相同,二是不能在一条直线上,即二维数组中三对坐标两两值不相等,且任意两对坐标的斜率不能相等。直接将题目的意思翻译过来即可,但是在计算两点的斜率时,如果分母为0或者分子为0,即这两个点可能与x轴、y轴平行,需要返回false。另外算斜率要用double类型,不能用int类型。

public boolean isBoomerang(int[][] points) {
int x1 = points[0][0], x2 = points[1][0], x3 = points[2][0];
int y1 = points[0][1], y2 = points[1][1], y3 = points[2][1];
// 坐标两两不等
if ((x1 == x2 && y1 == y2) || (x2==x3 && y2==y3) || (x1==x3 && y1==y3)) {
return false;
}
// 不能和x轴、y轴平行
if ((x1 == x2 && x2 == x3) || (y1 == y2 && y2 == y3)) {
return false;
}
// 计算斜率
double slope = (y2-y1)/((double)x2-x1);
double slope2 = (y3-y2)/((double)x3-x2);
return slope != slope2;
}

03 第二种解法

还可以从另外的角度来看,依旧是数学角度,根据题目给的回旋镖定义,要是三个点能够组成一个回旋镖,那么三个点合成的区域一定是一个三角形。那么我们可以计算出三条边的长度,用三角形的定义来判断三条边能否组成一个三角形。

public boolean isBoomerang2(int[][] points) {
int x1 = points[0][0], x2 = points[1][0], x3 = points[2][0];
int y1 = points[0][1], y2 = points[1][1], y3 = points[2][1];
// 计算三边的长度
double a = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double b = Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
double c = Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
boolean flag = a+b>c && a+c>b && b+c>a;
boolean flag2 = a-b<c && a-c<b && b-c<a;
return flag && flag2;
}

04 小结

算法专题目前已连续日更超过七个月,算法题文章254+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

最新文章

  1. TortoiseGit使用手册
  2. HDU 1131 Count the Trees 大数计算
  3. IOS开发之开篇--CocoaPods安装
  4. 关于我们DOM的知识点
  5. adMob iAd整合,随机根据网络状况自动显示。
  6. poi实现将数据输出到Excel表格当中
  7. POJ2411 - Mondriaan's Dream(状态压缩DP)
  8. [topcoder]IncrementAndDoubling
  9. php 不写闭合标签
  10. VC调用Delphi对象接口
  11. 【BZOJ3716】[PA2014]Muzeum(贪心,网络流)
  12. 在生成一个窗体的时候,点击窗体的右上角关闭按钮激发窗体事件的方法:窗体Frame为事件源,WindowsListener接口调用Windowsclosing()。
  13. json转数组
  14. ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)
  15. Array与Object
  16. GSON中Java对象与JSON互相转换——(一)
  17. loj#2016. 「SCOI2016」美味
  18. Exception in thread “main” java.sql.SQLException: No suitable driver
  19. C#的委托与Java的自定义接口的异曲同工的同步操作
  20. Popupwindow全屏问题

热门文章

  1. BZOJ3555 [Ctsc2014]企鹅QQ[暴力+字符串hash]
  2. Android 腾讯bugly Tinker 热修复
  3. k8sCronJob控制器
  4. 前端要懂的nginx配置
  5. 微信里关闭窗口 js
  6. sql DATEDIFF函数使用
  7. Socket 对象(内建)方法
  8. cogs1682. [HAOI2014]贴海报 x
  9. 【转】有rand7(可以随机生成1到7的数据的随机函数),如何产生rand10(随机产生1-10的数)
  10. php 将几个变量合为数组,变量名和值对应