Solution1:
严谨的正确答案为leetcode 149.
https://blog.csdn.net/Allenlzcoder/article/details/82154994
此贴中的答案漏洞极多!
参考网址:https://www.nowcoder.com/profile/250145/codeBookDetail?submissionId=12700731
思路:这个思路的代码比较简洁。思想是穷举完每两个点,同时算出一组斜率和截距,最后统计所有的<斜率,截距>对,找出数目最多的即可。复杂度为
O
(
n
2
)
O(n^2)
O(n2),这要比每两个点算出斜率后,再去算哪个点在直线上要简洁的多。
注意map,pair和make_pair的用法!。
/*
struct Point {
int x;
int y;
Point() :
x(0), y(0) {
}
Point(int xx, int yy) {
x = xx;
y = yy;
}
};*/
class DenseLine {
public:
vector<double> getLine(vector<Point> p, int n) {
map<pair<double, double>, int > lines;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
++lines[calLine(p[i],p[j])];
}
}
auto it = lines.begin();
auto maxLine = it;
int max = 0;
while(it != lines.end()){
if(it->second > max) maxLine = it;
it++;
}
vector<double> res;
res.push_back(maxLine->first.first);
res.push_back(maxLine->first.second);
return res;
}
//计算斜率
pair<double, double> calLine(Point p1,Point p2){
double k = (double)(p1.y - p2.y)/(double)(p1.x - p2.x);
double s = (double)p1.y - (double)k*p1.x;
return make_pair(k,s);
}
};