算法笔记 -- 1037. 有效的回旋镖

82 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

一、题目描述:

1037. 有效的回旋镖 - 力扣(LeetCode)

给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。

回旋镖 定义为一组三个点,这些点 各不相同 且 不在一条直线上 。

 

示例 1:

输入:points = [[1,1],[2,3],[3,2]]
输出:true

示例 2:

输入:points = [[1,1],[2,2],[3,3]]
输出:false

提示:

  • points.length == 3
  • points[i].length == 2
  • 0 <= xi, yi <= 100

二、思路分析:

注意是:不在一条直线上 才返回true; //其实可以不用 判断是否有重复的点,因为只要 有重复的点,那么这三个点必定在同一条直线上。 题中先判断是否有重复的点,经过筛选后,就没有重复的点了。 如果0,1两点x不等,那么就直接计算k0,如果1,2x相等,那么必定不在一条直线上(因为1,2的y必定不等) 如果0,1两点x相等,那么直接看0,2两点x是否相等,如果不等 ,那么必定 不在一条直线上。return true;反之相等 return false;

三、AC 代码:

class Solution {
public:
    bool isBoomerang(vector<vector<int>>& point) {
        /*
        直接判断是否都在一条直线上就行。
        两点构成一条直线,所以计算任意两条直线的斜率K即可.
        为了避免有重复的点,可以选择计算所有任意两个点的斜率。
        */
        if(point[0][0] == point[1][0]&&point[0][1] == point[1][1]){
            return false;
        }else if(point[0][0] == point[2][0]&&point[0][1] == point[2][1]){
            return false;
        }else if(point[1][0] == point[2][0]&&point[1][1] == point[2][1]){
            return false;
        }
        double k1 = 0;
        double k2 = 0;
        if(point[0][0]-point[1][0]!=0){
            k1 = (point[0][1] - point[1][1])* 1.0/(point[0][0]-point[1][0]);
            if(point[0][0]-point[2][0]!=0){
                k2 = (point[0][1] - point[2][1]) * 1.0/(point[0][0]-point[2][0]);
                if(k1 == k2)return false;
                else return true; 
            }else{
                return true;
            }
        }
            
        else{
            k1 = point[0][0];
            if(point[1][0]-point[2][0]!=0){
                return true;
            }else{
                return false;
            }
        }
            
    }
};

范文参考【斜率】+【向量平行】优化后两行代码 - 有效的回旋镖 - 力扣(LeetCode)