1. 题目

给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]。
请找出一条直线,其通过的点的数目最多

设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为S,你仅需返回[S[0],S[1]]作为答案
若有多条直线穿过了相同数量的点,则选择S[0]值较小的直线返回,S[0]相同则选择S[1]值较小的直线返回。

示例:
输入: [[0,0],[1,1],[1,0],[2,0]]
输出: [0,2]
解释: 所求直线穿过的3个点的编号为[0,2,3]提示:
2 <= len(Points) <= 300
len(Points[i]) = 2

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-line-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 暴力法,固定一个点,遍历所有剩余的
  • 采用嵌套的哈希map,第一层key存储斜率,第二层key存储截距,value为点的set集合(存储下标)
  • 斜率不存在,单独再开一个哈希表,key为与 x 轴的截距,value为点集合
  • 遍历所有集合找最多的
  • 对相等长度的点集合排序,取出题目要求的最小的下标的
  • 时间复杂度 O(n2)O(n^2)O(n2)
class Solution {public:vector<int> bestLine(vector<vector<int>>& points) {int i, j, g, dx, dy, maxCount = 0, n = points.size();double k, b;unordered_map<double,unordered_map<double,set<int>>> m;//k,b,pointsunordered_map<double,set<int>> v;//x轴截距,斜率不存在时的集合vector<set<int>> ans;for(i = 0; i < n-1; ++i){for(j = i+1; j < n; ++j){dx = points[j][0]-points[i][0];dy = points[j][1]-points[i][1];if(dx==0)//斜率不存在{if(v[double(points[i][0])].empty())v[double(points[i][0])].insert(i);v[double(points[i][0])].insert(j);}else{k = double(dy)/dx;b = double(points[i][1])-points[i][0]*k;if(m[k][b].empty())m[k][b].insert(i);m[k][b].insert(j);}}}for(auto& mi : m){for(auto& mii : mi.second){if(mii.second.size() > maxCount){maxCount = mii.second.size();ans.clear();ans.push_back(mii.second);}else if(mii.second.size() == maxCount)ans.push_back(mii.second);}}for(auto& vi : v){if(vi.second.size() > maxCount){maxCount = vi.second.size();ans.clear();ans.push_back(vi.second);}else if(vi.second.size() == maxCount)ans.push_back(vi.second);}sort(ans.begin(),ans.end(),[&](auto a, auto b){auto it1 = a.begin(), it2 = b.begin();if(*it1 == *it2)return *(++it1) < *(++it2);return *it1 < *it2;});auto it = ans[0].begin();return {*it,*(++it)};}
};

660 ms 117.7 MB

程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)相关推荐

  1. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]

    [问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...

  2. java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  3. 程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  4. 程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)

    1. 题目 请实现整数数字的乘法.减法和除法运算,运算结果均为整数数字, 程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算. 你的实现应该支持如下操作: Operati ...

  5. 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 不排序 1. 题目 给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的. 注意 ...

  6. 程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)

    1. 题目 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式. 例如,字符串"ca ...

  7. 程序员面试金典 - 面试题 08.14. 布尔运算(区间动态规划)

    1. 题目 给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false).1 (true).& (AND). | (OR) 和 ^ (XOR) 符号组成. 实现一个函 ...

  8. 程序员面试金典 - 面试题 16.13. 平分正方形(数学)

    1. 题目 给定两个正方形及一个二维平面.请找出将这两个正方形分割成两半的一条直线. 假设正方形顶边和底边与 x 轴平行. 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = ...

  9. 程序员面试金典 - 面试题 16.03. 交点(数学)

    1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...

最新文章

  1. 负载均衡策略关键因素
  2. Unable to merge dex
  3. Java蓝桥杯——贪心算法
  4. ASP.net之策略模式
  5. PROC系列之---/proc/pid/stat
  6. CRM_REPORT_RF_AUTH_OBJ_ORD_PR
  7. [nodejs] 利用openshift 撰寫應用喔
  8. linux释放内存后设备起不来,Linux-Memory小记
  9. Container的限制
  10. Atitit 提升开发效率法 fx t35 Atitit 提升开发效率法---开发方法架构简化法.docx 目录 1. 主要几个层次上简化开发 1 1.1. ,开发体系方法使用简单方法 1 1.2.
  11. SQL2008卸载。
  12. matlab图片测量尺寸_matlab尺寸测量
  13. 人月神话(12)干将莫邪
  14. 火狐浏览器截图整个网页截图 截取整个网页
  15. 高并发时,读文件、读SESSION、读缓存(Redis)和读数据库(Mysql)的查询效率哪家强?
  16. STM32 keyboard USB HID键盘功能的实现
  17. Python代码实现NIST随机性测试
  18. linux内核snat分析,(十)洞悉linux下的Netfilteriptables:网络地址转换原理之SNAT
  19. 《三易通服装进销存软件》项目研发阶段性总结
  20. 12. 整数转罗马数字。

热门文章

  1. java mapstring_ object 遍历_ListMapString,Object使用Java代码遍历以获取String,Object的值...
  2. st官网下载stm32固件库方法
  3. 【机器学习实战之一】:C++实现K-近邻算法KNN
  4. mysql select 子查询_SELECT中常用的子查询操作
  5. 分页类与前台和后台的调用方法
  6. js获取当前日期星期几
  7. 2016.07.24
  8. PWM调光方法在LED亮度调节中的应用
  9. 把一个数据库的数据插入到另外一个数据库
  10. ptmalloc,tcmalloc和jemalloc内存分配策略研究