给定一个二维平面及平面上的 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

感谢silentteller大神,传送门https://www.cnblogs.com/silentteller/

建议先理解149.直线上最多的点数

class Solution {public int[] bestLine(int[][] points) {return bestLineI(points);
//            return bestLineII(points);}//方法二:三层for循环private int[] bestLineII(int[][] points) {if (points.length < 3) return new int[]{0, 1};int max = 0;int[] res = new int[2];for (int i = 0; i < points.length - 1; i++) {for (int j = i + 1; j < points.length; j++) {int nums = 2;int dy = points[j][1] - points[i][1];int dx = points[j][0] - points[i][0];for (int k = j + 1; k < points.length; k++) {int ky = points[k][1] - points[j][1];int kx = points[k][0] - points[j][0];//若等式相等,说明直线在一条直线上if (dy * kx == dx * ky) {nums++;}}//求出经过i,j两点组成直线的所有点,并返回结果if (nums > max) {max = nums;res[0] = i;res[1] = j;}}}return res;}//方法一:使用hashMap缓存斜率private int[] bestLineI(int[][] points) {//保存经过一条直线上所有的点List<Integer> res = new ArrayList<>();for (int i = 0; i < points.length - 1; i++) {Map<String, List<Integer>> map = new LinkedHashMap<>();for (int j = i + 1; j < points.length; j++) {int dx = points[j][0] - points[i][0];int dy = points[j][1] - points[i][1];int gcd = gcd(dx, dy);String key = dx / gcd + ":" + dy / gcd;List<Integer> list;if (map.get(key) == null) {//斜率key不存在,map中添加元素list = new ArrayList<>();list.add(i);list.add(j);map.put(key, list);} else {//因为只需要返回穿过直线的前两个点的编号,所以当斜率已经存在时,list追加j元素即可list = map.get(key);list.add(j);map.put(key, list);}if (list.size() > res.size()) {res = list;}}}return new int[]{res.get(0), res.get(1)};}private int gcd(int x, int y) {if (y == 0) return x;return gcd(y, x % y);}}

Leetcode刷题面试题 16.14. 最佳直线相关推荐

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

    1. 题目 给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]. 请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号 ...

  2. leetcode刷题-面试题46. 把数字翻译成字符串

    面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...

  3. leetcode刷题----祖玛游戏(14)

    在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W' .你的手中也有一些彩球. 你的目标是 清空 桌面上所有的球.每一 ...

  4. C#LeetCode刷题-程序员面试金典

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-程序员面试金典 | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode程序员面试金典 ...

  5. LeetCode刷题记录14——257. Binary Tree Paths(easy)

    LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...

  6. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  7. 【LeetCode刷题日记】常用算法基础和理解及运用

    在我们LeetCode刷题过程中,如果我们只是了解数据结构(数组,链表,数)的使用方法,那我们在面对复杂的题目时,是很难很好的解决问题的,因此我们要了解一些常用算法来帮助我们更好的解题. 递归和迭代 ...

  8. 个人LeetCode刷题记录(带题目链接及解答)持续更新

    Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...

  9. Leetcode-How-What 力扣Leetcode刷题指南

    Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...

最新文章

  1. 双击打开excel时提示:向程序发送命令时出现问题
  2. 「Python-Pycharm」zipimport.ZipImportError: can‘t decompress data; zlib not available
  3. 十六进制转float和“float转十六进制”经典代码
  4. anaconda的执行路径
  5. 移动前端框架重构几个关键问题
  6. 实例19:python
  7. 使用jsp实现word excel格式报表打印-JSP教程 Jsp/Servlet
  8. 将数据从MySql导入数据至SQL Server 2000
  9. jsp中 自定义 tag的几种方式
  10. php单进程锁定,强制PHP命令行脚本单进程运行的方法
  11. IAR Embedded Workbench IDE 显示行号
  12. WCF技术内幕之面向服务
  13. vscode设置字体颜色
  14. 计算机粘贴功能不能用了,电脑不能粘贴怎么回事_电脑不能粘贴了怎么解决
  15. 信息化和信息系统(3)
  16. 做大数据工程师,需要学习什么?
  17. UUID和UUID_SHORT
  18. 浏览器兼容性总结: IE 火狐 谷歌 360 搜狗
  19. c语言欧几里得算法求素数,jrs直播(无插件) -官网
  20. 再编写代码中报错:CS8107 C# 7.0 中不支持功能“xxxxxx”。请使用 7.1 或更高的语言版本。...

热门文章

  1. 傻白入门芯片设计,三大基本定律(十)
  2. Mybatis-01-配置详解
  3. 基于 Self-hosted Debug 的调试
  4. play 项目 入到Idea
  5. 用Servlet实现统计网站被访问次数的功能
  6. Unity高级知识点总结:性能优化与图形渲染进阶!
  7. 如何下载金融街街道卫星地图高清版大图
  8. 随机读写 vs 顺序读写
  9. Selenium-鼠标和键盘操作
  10. 二叉树的后序遍历(递归和非递归)