【力扣 1232】缀点成线 C++题解(向量+数学)

给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。

示例 1:

输入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
输出:true
示例 2:

输入:coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]]
输出:false

提示:

2 <= coordinates.length <= 1000
coordinates[i].length == 2
-10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4
coordinates 中不含重复的点


思路

首先,定义了一个函数getK来计算两点之间的斜率。如果两点的x坐标相同,说明这两点之间的线段是垂直的,斜率不存在,函数返回一个特殊值(0,0)。否则,函数返回斜率的值和一个标记1,表示斜率存在。

然后,检查点集的大小。如果只有两个点,那么这两个点肯定可以构成一条直线,函数直接返回true。如果点集中有多于两个的点,那么函数计算第一个点和第二个点之间的斜率,并将其存储在k0中。

接下来,函数遍历点集中剩余的每个点。对于每个点,计算它和第一个点之间的斜率,并检查这个斜率是否和k0相等。如果有任何一个斜率不等于k0,那么这些点就不能构成一条直线,函数返回false。

如果所有的点都被检查过,并且它们的斜率都等于k0,那么这些点就可以构成一条直线,函数返回true。


AC代码

/*
 * @lc app=leetcode.cn id=1232 lang=cpp
 *
 * [1232] 缀点成线
 */

// @lc code=start
class Solution {
   public:
	pair<double, bool> getK(vector<int> a, vector<int> b) {
		if (b[0] == a[0]) {
			return make_pair(0, 0);
		}
		return make_pair((double)(b[1] - a[1]) / (double)(b[0] - a[0]), 1);
	}
	bool checkStraightLine(vector<vector<int>>& coordinates) {
		if (coordinates.size() == 2) {
			return true;
		}
		auto k0 = getK(coordinates[0], coordinates[1]);
		for (auto it = coordinates.begin() + 2; it != coordinates.end(); it++) {
			if (getK(coordinates[0], *it) != k0) {
				return false;
			}
		}
		return true;
	}
};
// @lc code=end

你可能感兴趣的:(Algorithm,Problems,leetcode,c++,算法)