题解 | #直线上的牛#
直线上的牛
https://www.nowcoder.com/practice/58ff4047d6194d2ca4d80869f53fa6ec
#include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param points int整型vector<vector<>> * @return int整型 */ int maxPoints(vector<vector<int> >& points) { // write code here // 时间复杂度O(n³) int result = 0; for (int i = 0; i < points.size(); ++i) { for (int j = i + 1; j < points.size(); ++j) { int cnt = 2; vector<int> v0 = {points[i][0] - points[j][0], points[i][1] - points[j][1]}; for (int k = j+1; k < points.size(); ++k) { vector<int> v1 = {points[i][0] - points[k][0], points[i][1] - points[k][1]}; if (v0[0] * v1[1] == v0[1] * v1[0]) { // 两向量共线 cnt++; } } result = max(result, cnt); } } return result; } }; // class Solution { // public: // /** // * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 // * // * // * @param points int整型vector<vector<>> // * @return int整型 // */ // int maxPoints(vector<vector<int> >& points) { // // write code here // // double为斜率,后面存储坐标点 // map<double,set<pair<double,double>>> m_1; // // 处理共竖线和共横线的情况; // map<string,set<pair<double,double>>> m_2; // // 第i个点 // for(int i=0; i<points.size(); ++i) // { // double x_1 = (double)points[i][0]; // double y_1 = (double)points[i][1]; // // i之后的点 // for(int j=i+1; j<points.size(); ++j) // { // double x_2 = (double)points[j][0]; // double y_2 = (double)points[j][1]; // // 两点之间的坐标距 // double x_len = x_2-x_1; // double y_len = y_2-y_1; // // 共竖线 // if(x_len==0) // { // m_2["sameX"].emplace(make_pair(x_1,y_1)); // m_2["sameX"].emplace(make_pair(x_2,y_2)); // } // // 共横线 // else if(y_len==0) // { // m_2["sameY"].emplace(make_pair(x_1,y_1)); // m_2["sameY"].emplace(make_pair(x_2,y_2)); // } // // 其它斜率 // else // { // m_1[y_len/x_len].emplace(make_pair(x_1,y_1)); // m_1[y_len/x_len].emplace(make_pair(x_2,y_2)); // } // } // } // int ans = 0; // for(auto it=m_1.begin(); it!=m_1.end(); ++it) // ans = max(ans,(int)(it->second).size()); // ans = max(ans,(int)m_2["sameX"].size()); // ans = max(ans,(int)m_2["sameY"].size()); // return ans; // } // };