斜率哈希+欧几里得:平面点集共线检测算法
创作时间:
2025-01-22 04:11:14
作者:
@小白创作中心
斜率哈希+欧几里得:平面点集共线检测算法
同一直线上的点集相关问题,使用哈希表遍历的方法,外层循环选定一个点,从头到尾去遍历其余的点,查看有多少的点与给定点的直线斜率相同(我们知道,一个点和一个斜率可以确定一条直线),那么只需要在哈希表记录下内层循环遍历下同一斜率的点,最后加上定点就得到当前组合下的最大点数。
斜率一共对应五种情况:
横纵坐标差值为0是特殊情况处理,直接给特定斜率
- 横坐标差值为0 (字符串“ 1/ 0” 表示)
- 纵坐标差值为0 (字符串“ 0 / 1 “表示)
- 横纵差值都为正 (斜率为正)
- 横纵差值都为负 (斜率为正)
- 横纵差值有一个为负一个为正 (斜率为负,并且-1 /2 和 1 / -2 都要统一为-1 /2 )
最终把斜率转换为字符串存储,先使用欧几里得算法来缩放差值diff_x和diff_y,得到一个最简斜率(需要为负数斜率加”-“)作为哈希表的key
class Solution {
public:
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
int maxPoints(vector<vector<int>>& points) {
if (points.size() == 1) {
return 1;
}
int res = INT_MIN;
for (int i = 0; i < points.size(); i++) {
unordered_map<string, int> lineMap;
int resV = INT_MIN;
for (int j = i + 1; j < points.size(); j++) {
int diff_x = points[i][0] - points[j][0];
int diff_y = points[i][1] - points[j][1];
int g = gcd(abs(diff_x), abs(diff_y));
int shrink_x = 0;
int shrink_y = 0;
if(diff_x == 0){
shrink_x = 1;
shrink_y = 0;
}else if(diff_y == 0){
shrink_x = 0;
shrink_y = 1;
}else{
shrink_x = diff_x / g;
shrink_y = diff_y /g;
}
string lineRate = "";
lineRate += to_string(abs(shrink_x));
lineRate.push_back('_');
lineRate += to_string(abs(shrink_y));
if(shrink_x < 0 && shrink_y > 0|| shrink_x > 0 && shrink_y < 0){
lineRate = "-"+lineRate;
}
lineMap[lineRate]++;
resV = max(lineMap[lineRate], resV);
}
res = max(res, resV + 1);
}
return res;
}
};
欧几里得算法:(递归写法,当一个参数为0时,自动返回另一个非零参数)
int gcd(int a,int b){
return b == 0 ? a : gcd(b,a%b);
}
热门推荐
打鼾的原因都有哪些
7种叙事结构
故宫建筑艺术与历史价值研究
咳嗽“最怕”这4道菜,这个时候要常吃,滋阴润燥止咳化痰
怎样根据受众调整演讲的语言风格和内容深度
硬件开发设计文档撰写指南
英雄联盟手游排位禁用英雄推荐 提升胜率的必备指南
MBTI:解读个体性情的测试工具及维度
吃樱桃的好处与坏处:营养滋补与健康之间的平衡
ECharts实现豆瓣电影TOP250的四个图表可视化案例
段祺瑞:北洋之虎的传奇人生
英语连读规则详解
珍珠保养指南:让您的珍珠首饰永葆亮丽
熊与虎的较量:力量与技巧的对决
八大策略优化登记系统,全面提升工作效率
如何让自己不再吃醋?破解醋意的心理技巧与情感管理
不得不知的基本的Docker容器管理命令
著名词曲作家评价刀郎:他颠覆了艺术,作品处于低俗和高雅之间
遇到APP网络错误提示?这份检查与修复指南请收好
意外发现胆囊息肉怎么办?会是胆囊癌吗?图文详解
建设高质量户外运动目的地 激发户外产业新活力
可溶性膳食纤维 vs 不可溶性膳食纤维:哪种更能增加饱腹感?
软件仿真、硬件仿真、原型验证是如何工作的?
亲子阅读策略分享:家长怎样做个“高质量伴读者”?
文本管理如何规范整理文档
英文连音/连读技巧大揭秘:掌握连音规则,让口语更流利自然
学会放手与释怀,解脱心灵的枷锁
到底什么是编制?行政编和事业编有啥区别呢?
PPT创建优化表格提升可读性的方法
构建家庭NAS:从需求分析到硬件选购的完整指南