《程序员面试金典(第6版)》面试题 16.14. 最佳直线(向量,C++)

2023-05-16

题目描述

给定一个二维平面及平面上的 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

解题思路与代码

这道题又是一道关于数学几何问题的题目,考察到了同学们对向量知识的了解。如何通过向量来判断3点共线问题。

  • 如果大家的几何数学知识好的话,这道题确实不算一道难题。就直接先来给大家普及一下向量的知识吧。

    • 假如点A,点B两点构成一条直线,我们可以用向量a去表示这条直线。那么a这个向量坐标我们可以记为(x1,y1)x1 = xB - xA, y1 = yB - yA
    • 假如点A,点C两点构成一条直线,我们可以用向量a去表示这条直线。那么b这个向量坐标我们可以记为(x2,y2)x2 = xC - xA, y2 = yC - yA
    • 如果直线AC与直线AB是同一条直线了话,向量a - 向量b = 0;根据向量的运算法则,也就是说,x2y1 - x1y2 = 0;
    • OK,直到这么多关于向量的知识就可以了。我们就可以来解决这道题了。
  • 对于这道题,我们需要先创建一个vector(result)来存储最后的答案,两个int(maxCount,count)来去记录遍历中一条直线穿过最多节点的个数。

  • 之后用双层for循环固定两个点,也就是一个向量,第三层for循环再固定一个点,与第一个点凑成第二个向量

  • 第三层for循环就是用来循环比较一条直线上有多少个点的。如果有,我们就加入count,第三层循环完毕后,更新maxcount,result的值。

  • 最后我们可以进行一个剪枝操作,也就是points.size()- 1 - j + 2 <= maxcount

    • points.size() - 1 - j表示从当前点j开始到最后一个点之间的点的数量。加2是因为我们还要考虑初始的两个点i和j。
  • 最后返回result,我们这道题就算是彻底做完啦!

具体的代码如下:

class Solution {
public:
    vector<int> bestLine(vector<vector<int>>& points) {
        vector<int> result(2);
        int maxcount = 0;
        int count = 0;
        for(int i = 0; i < points.size() - 1; ++i){
            for(int j = i + 1; j < points.size(); ++j){
                if(points.size()- 1 - j + 2 <= maxcount) break;
                long long x1 = points[j][0] - points[i][0];
                long long y1 = points[j][1] - points[i][1];
                count = 2;
                for(int k = j + 1; k < points.size(); ++k){
                    long long x2 = points[k][0] - points[i][0];
                    long long y2 = points[k][1] - points[i][1];
                    if(x1 * y2 == x2 * y1) ++count;
                }
                if(count > maxcount){
                    maxcount = count;
                    result[0] = i;
                    result[1] = j;
                }
            }
        }
        return result;
    }
};

在这里插入图片描述

复杂度分析

对于给定的点集,我们首先遍历所有的点对 (i, j)。这需要 O(n^2) 的时间复杂度,其中 n 是点的数量。接下来,我们对于每一对点 (i, j),检查其他点是否在它们构成的直线上。这需要 O(n) 的时间复杂度。因此,总的时间复杂度是 O(n^3)。

现在,让我们分析空间复杂度。

在这个实现中,我们仅使用了几个变量来存储计数和结果。这些变量的数量与点的数量无关。因此,空间复杂度为 O(1)。

综上所述,这道题的时间复杂度为 O(n^3),空间复杂度为 O(1)。

总结

这道题目的意义在于测试一个程序员的编程能力,以及他们对几何和向量概念的理解。题目需要解决的问题是在给定的二维平面上的点集中,找到一条穿过最多点的直线。这是一个常见的几何问题,可以通过多种方法解决。

在解决此问题时,程序员需要考虑以下几个方面:

  1. 理解题目中的点和直线的概念。
  2. 设计一个有效的算法来找到穿过最多点的直线。
  3. 确保算法能够处理不同大小和形状的输入数据。
  4. 优化算法,使其在处理大量数据时具有较高的效率。

通过这道题目,程序员可以锻炼自己的编程技巧、逻辑思维能力和对数学概念的理解。此外,这道题还可以帮助程序员学会优化算法以提高代码的效率。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《程序员面试金典(第6版)》面试题 16.14. 最佳直线(向量,C++) 的相关文章

  • 使用IDEA连接数据库

    1 要先导入jar包才能连接成功 2 在IDEA右侧点击 3 连接 4 连接成功后选择数据库 连接不上的话 xff0c 可以看一下下面这里 xff0c 配置对应的mysql版本 双击数据库 修改后点击提交 编写SQL语句工作台 编写语句
  • pojo层、dao层、service层、controller层的作用

    pojo层 xff08 model xff09 实体层 数据库在项目中的类model是模型的意思 xff0c 与entity domain pojo类似 xff0c 是存放实体的类 类中定义了多个类属性 xff0c 并与数据库表的字段保持一
  • 使用JPofiler工具分析OOM原因

    在一个项目中 xff0c 突然出现了OOM故障 xff0c 那么该如何排除 能够看到代码第几行出错 xff1a 内存快照分析工具 xff0c MAT xff0c Jprofiler Dubug xff0c 一行行代码分析 xff01 MAT
  • lambda表达式,函数式接口,链式编程,Stream流式计算

    新时代的程序员 xff1a lambda表达式 xff0c 函数式接口 xff0c 链式编程 xff0c Stream流式计算 函数式接口 函数式接口 xff1a 只有一个方法的接口 简化编程模型 xff0c 在新版本框架底层中大量应用 x
  • ForkJoin

    什么是ForkJoin ForkJoin在JDK1 7 xff0c 并行执行任务 xff01 提高效率 xff0c 大数据量 xff01 大数据 xff1a Map Reduce xff08 把大任务拆分为小任务 xff09 ForkJoi
  • 异步回调

    Future Future设计的初衷 xff1a 对将来的某个事件的结果进行建模 没有返回值的runAsync异步回调 import java util concurrent CompletableFuture import java ut
  • 记录安卓,IOS安装kali的办法

    纯做记录 xff0c 不要用此技术做违法的事情 xff0c 仅供研究 xff0c 概不负责 一年前的小日记 xff0c 照抄过来记录一下 现在安卓有一个ZeroTermux更好用 xff0c 可以傻瓜式安装kali xff0c 三星S10完
  • Java 案例大全(详细)一

    一直在更新 案例汇总比身高判断奇偶数考试评价春夏秋冬正反输出数据求和1逢七过不死神兔百钱买百鸡输出所有时间珠穆朗玛峰求和2猜数字数组直接操作比较最大值获取最小值数组内容相同查找元素反转元素评委打分用户登录遍历字符串统计字符次数字符串的拼接1
  • 一次完整的http请求过程

    浏览器输入一个URL回车后 xff0c 会发生什么呢 一 http请求的完整过程简述 1 域名解析 xff1a 使用DNS协议进行域名解析 2 建立连接 xff1a 发起TCP三次握手 3 发起http请求 xff1a 建立TCP连接成功后
  • 《上海滩》命运的真实

    上海滩 命运的真实 小时候 xff0c 家里没电视 xff0c 像80年周润华版 上海滩 这样的经典 xff0c 通常也会很难一集不漏地看全 当然 xff0c 那个时候也看不懂那个冯程程的漂亮 许文强的帅气 xff0c 更看不懂冯敬尧的强横
  • C语言实现温度转换

    例1 xff1a 有人用温度计测量出用华氏温度98 F xff0c 现在要求用C语言实现把它转换为以摄氏法表示的温度 解题思路 xff1a 这个问题的算法很简单 xff0c 关键在于找到二者之间的转化公式 xff0c 摄氏度等于九分之五乘以
  • Java的集合类有哪些?

    集合 Java的集合主要有两种 xff0c 一种是单列集合Collection xff0c 一种是双列集合Map Collection Collection是单列集合包含List和Set List List包含ArrayList LinkL
  • 《SSM医疗管理系统》计算机毕业设计|Java毕设项目|医疗管理|医疗服务|医疗系统|

    SSM医疗管理系统 项目含有源码 文档 配套开发软件 软件安装教程 项目发布教程 技术路线 xff1a 该项目采用技术jsp SpringMVC Spring Mybatis tomcat服务器 mysql数据库 开发工具eclipse 主
  • 【笔记】lamp架构框图

    一 lamp架构 1 lamp基础结构 2 分布式lamp架构 3 实际运用 二 OSI七层和TCP IP五层关系 这部分具体可以参考网址 1 OSI七层 OSI xff08 Open System Interconnect xff09 x
  • SpringBoot( 扩展篇 ==> 使用枚举完成前后端数据传输规范

    本章导学 xff1a Result类设计enum设计controller层设计service与mapper层设计 在我们平时的开发中 xff0c 后端响应回给前端的请求一般都需要规范成统一的格式 xff0c 比如下图的这种格式 xff0c
  • AD软件学习

    AD软件学习 基本快捷键 电气画线 xff1a crtl 43 W放大缩小 xff1a 鼠标滚轮 crtl 43 鼠标右键旋转 xff1a space空格键1D 2D 3D切换 xff1a 数字键1 2 3清除 xff1a T 43 M测量
  • Ubuntu 2004 鼠标可以移动但是点击无响应 排查流程

    今天工作机遇到了这个问题 xff0c 就记录一下 解决方案看这里 span class token function sudo span span class token function apt span span class token
  • SSM项目的pom,springmvc,spring,mybatis配置文件

    1 pom配置文件 一个基本上完整的pom文件 xff0c 集成了常见的spring springmvc mybatis的依赖 xff0c 同时增加了json 分页 文件上传依赖 xff0c 作为一个ssm的初学者 xff0c 使用此pom
  • 再见 Pycharm,这款开箱即用的轻量级神器你值得拥有

    文 豆豆 来源 xff1a Python 技术 ID pythonall 如果你问我最好用的 IDE 是什么 xff0c 那我肯定会毫不犹豫的告诉你 Pycharm 毕竟 jetbrains 出品必属精品 但对于很多初学者来讲 xff0c
  • Springmvc pom.xml

    lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xmlns x

随机推荐

  • 中国房价不可能下降的19个理由

    中国房价不可能下降的19 个理由 2014 年01月26日 根据 腾讯房产 资料整理 在 腾讯房产 频道看到的 xff0c 所谓专家解释说的房价不可能下降有N 个无以辩驳理由 虽然少数内容缺乏数据依据 xff0c 但总体来看 xff0c 分
  • Spring MVC学习 | 注解配置Spring MVC&总结

    文章目录 一 注解配置Spring MVC1 1 初始化类1 2 Spring MVC配置类1 3 完整配置过程 二 总结2 1 常用组件2 2 执行流程 学习视频 x1f3a5 xff1a https www bilibili com v
  • oepncv实现——图像去水印

    功能简介 xff1a 通过拖动鼠标实现指定区域水印或是斑点的去除 实现原理 xff1a 利用opencv鼠标操作setMouseCallback函数框选 xff08 左上到右下 xff09 需要处理的区域 xff0c 按下鼠标开始选中 xf
  • Windows系统远程连接Linux系统操作

    远程连接服务器管理时 xff0c 系统不同可分为两种 xff1a 一是Linux系统和Mac系统或者Linux系统之间连接 xff1b 二是Windows系统连接到Linux系统 第一种情况下 xff1a 在Linux系统和Mac系统下可以
  • Markdown教程

    Markdown 是一种轻量级标记语言 xff0c 它允许人们使用易读易写的纯文本格式编写文档 Markdown 语言在 span class token number 2004 span 由约翰 格鲁伯 xff08 英语 xff1a Jo
  • 给一个图的所有边集求所有的最大连通子图

    数据结构如下 struct Road int node 1 int node 2 极大连通图 struct ConnectedGroup std vector lt Road gt roads void FindMaxConnectedGr
  • Python脚本登入多台华为设备-网络编程与自动化-Python telnetlib库的常用方法(2)

    1 实验要求 通过本实验 xff0c 读者将掌握Python telnetlib库的常用方法 通过python脚本自动化登入多台设备并导出当前设备配置文件 2 实验组网 xff1a 3 配置思路及步骤 要完成通过python脚本自动化登入设
  • vs2019豆沙绿背景色及consolas字体设置

    个人喜欢将编辑器背景设置成豆沙绿 xff0c 保护眼睛 在vs2019中豆沙绿背景以及consolas字体配置方法如下 xff1a 工具 gt 选项 gt 环境 gt 字体和颜色 xff0c 显示项为 纯文本 xff0c 设置项背景色 xf
  • windows安装Ubuntu18.04双系统(系统盘制作和ubuntu分区)

    一 xff0c 制作系统盘 1 点击Ubuntu18 04镜像下载镜像 2 制作U盘启动盘 1 xff09 安装制作工具 xff1a UltralSO xff0c 下载后完成安装 2 xff09 插入用来做启动盘的U盘 xff0c 并清空里
  • 试用AI写作软件AI-WRITER.COM:重写(rewrite)功能测试简短报告

    试用AI WRITER COM xff1a 重写 rewrite 功能测试 试用网站连接https ai writer com 1 操作页面简介 xff1a 2 选定重写文案 xff1a 我直接使用官网后台定制关键词后 xff0c 自动推荐
  • 抢位|AI 时代下程序员的硬核技能

    ChatGPT 占领了几乎全部媒体的近日头条 xff0c 也引发了不少人思考 AI 时代下自己不可替代的工作价值 AI 时代程序员的硬核技能是什么 xff1f 如何拥有这一硬核技能 xff1f Tubi 研发副总裁陈天将在2023 4 16
  • 如果生命就是一次马航之旅

    岁月长河中 xff0c 生命只不过是一粒尘埃 xff0c 渺小而短暂 xff1a 正如一场马航之旅 xff0c 从起点到终点 xff0c 正常飞行6小时后一定能抵达目的地 xff1b 当波音777平稳抵达目的地后 xff0c 无论你多么留念
  • SAP smartforms 打印失败 消息类型:SSFCOMPOSER 消息号:601 (货币和数字字段设置参考及格式)

    首先先感谢大佬 上连接 SAP smartforms 打印失败 首先说一下问题 在全局给的变量 在表中找不到 就是这两个参数 类型QUAN 报错信息 消息类型 SSFCOMPOSER 消息号 601 然后渠道se91查找该消息表示并搜索消息
  • tightvnc ubuntu,10步掌握ubuntu配置tightvnc的方法

    简单介绍下 xff0c VNC服务是一款优秀的屏幕分享及远程连接服务 xff0c 基于RFB协议 xff0c 使用C S架构 此服务可保证你连接图形界面 xff0c 真系点点点重度患者的福音 IIS7服务器管理VNC客户端 xff0c II
  • SpringBoot学习笔记(一)——SpringBoot项目文件全解析及配置文件的选择与使用

    上周Redis的学习终于告一段落 xff0c 这周就要开始学习SpringBoot部分的内容了 xff0c 这部分的内容我觉得很重要 xff0c 毕竟SpringBoot是现在十分主流的开发框架 xff0c 学就完事了 希望还有不懂的小伙伴
  • Linux驱动开发(从零开始编写一个驱动程序)

    1 系统整体工作原理 1 应用层 gt API gt 设备驱动 gt 硬件 2 API xff1a open read write close等 3 驱动源码中提供真正的open read write close等函数实体 2 file o
  • 深度优先搜索python

    深度优先搜索 概念 深度优先搜索和广度优先搜索一样 xff0c 都是对图进行搜索的算法 xff0c 目的也都是从起点开始搜索直到到达指定顶点 xff08 终点 xff09 深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止 xff0c
  • 006. 虚拟机连接Xshell和XEtp

    文章预览 xff1a 一 连接Xshell二 连接XEtp 单纯使用虚拟机 xff0c 通过命令的方式来操作系统 xff0c 用户体验感不强 xff0c 这里有两款应用 xff0c 可以优化我们的使用体验感 Xshell xff1a 负责向
  • 图像处理和系统(一)

    在机器视觉系统中 xff0c 图像的空间和灰度精度取决于照明 镜头 摄像头和采集卡 xff1b 而速度则主要取决于摄像头的帧频和采集后图像处理的速度 在机器视觉系统中 xff0c 从获得图像数据到最后获得处理结果 xff0c 通常要经过很多
  • 《程序员面试金典(第6版)》面试题 16.14. 最佳直线(向量,C++)

    题目描述 给定一个二维平面及平面上的 N 个点列表Points xff0c 其中第i个点的坐标为Points i 61 Xi Yi 请找出一条直线 xff0c 其通过的点的数目最多 设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为S