351判断回旋镖的存在 | 豆包MarsCode AI刷题

105 阅读2分钟

一、题目解析

题目描述

小M正在玩一个几何游戏,给定一个二维平面上的三个点 points,其中每个点用坐标 points[i] = [xi, yi] 表示。如果三点构成一个回旋镖,则返回 true。回旋镖的定义是三点不在一条直线上,并且这三个点互不相同。

请你帮助小M判断这些点是否构成一个回旋镖。

1、题目分析

这道题考的是用代码来判断三个点是否在一条线上,即两条线段的斜率是否相同。以及对于vector的熟练程度,能否理解vector<vector>的含义。

2、算法分析

vector<vector>v1表示一个vector类型里面的变量类型是一个vector,我们可以理解为是一个二维数组。 vector类型可以使用[]运算符来返回相应元素的引用。我们可以用v1[i][j]来表示不同的点的坐标位置。 斜率的计算:设两个点为(x1,y1),(x2,y2),斜率为(y1-y2)/(x1-x2)。

代码实现

bool solution(vector<vector<int>>& points) 
{
    if (points[0] == points[1] || points[1] == points[2] || points[0] == points[2]) 
    {
        return false;
    }
    int x1 = points[0][0], y1 = points[0][1];
    int x2 = points[1][0], y2 = points[1][1];
    int x3 = points[2][0], y3 = points[2][1];
    if ((y2 - y1) * (x3 - x1) != (y3 - y1) * (x2 - x1)) 
    {
        return true;
    }
    return false;
}

代码详解

首先判断特殊情况,当三个点的坐标有两个相同时不满足要求,返回false。 利用x1,x2,x3分别表示三个点的横坐标,用y1,y2,y3来表示三个点的纵坐标。 斜率k1=(y2-y1)/(x2-x1),k2=(y3-y1)/(x3-x1) 由于横纵坐标都是int型,则求出的k为int类型,误差会很大,所以假设两个斜率相同,即k1=k2,经过变换可以得到(y2-y1)(x3-x1)=(y3-y1)(x2-x1) 所以我们可以通过判断(y2-y1)(x3-x1)是否等于(y3-y1)(x2-x1)来判断两条线斜率是否相同。 如果两条线的斜率不相同则代表三个点能够构成一个回旋镖,返回true 否则三个点不能构成一个回旋镖,返回false。

二、知识总结

vector类型可以使用[]来返回对应元素的引用。 vector<vector>表示这个vector类型里面的变量类型为vector类型。我们可以使用二维数组的使用方式,用[][]来使用里面的数据。