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

news2024/11/19 17:22:00

题目描述

给定一个二维平面及平面上的 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. 优化算法,使其在处理大量数据时具有较高的效率。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简述对象检测与图像分类与关键点检测区别

计算机视觉是人工智能的一个多元化领域&#xff0c;旨在检测和识别图像或视频的内容。大多数开始计算机视觉领域之旅的人的常见问题之一是&#xff1a;目标检测、图像分类和关键点检测之间有什么区别&#xff1f; 让我们先看看 什么是对象检测 对象检测是一种计算机视觉和图像…

gateway sentinel 流控规则持久化到 nacos

Sentinel改造 sentinel版本是1.8.6 直接看更新内容, 右侧更新后 GatewayApiController /*** Gateway api Controller for manage gateway api definitions.** author cdfive* since 1.7.0*/ RestController RequestMapping(value "/gateway/api") public class…

【操作系统】内存空间

最小的操作系统Hello world 想要pmap这个进程&#xff0c;需要进程号 但是这个进程在启动的一瞬间就执行完了 用GDB把程序暂停下来&#xff0c;然后用pmap观察地址空间 用info inferiors得到gdb里的进程号 ro 可读 &#xff1a;只读数据 rx 可读可执行 &#xff1a;代码 rw 可…

Java学习:Scanner类及其应用

Java Scanner 一、next()二、nextLine()三、应用 一、next() 用于从标准输入读取下一个字符串。该方法会扫描输入流并返回下一个非空白字符序列&#xff0c;以空格、制表符或换行符作为分隔符 1、next()会以空格作为分隔符,一行输入1 2 3,只会打印出1 import java.util.Scan…

Java RSA密钥转换,从RSAPrivateKey得到RSAPublicKey

概述&#xff1a; 在Java编程中&#xff0c;我们经常用到如下一段代码来生成RSA公私钥&#xff0c;分别拿到公私钥然后加解密计算&#xff1a; KeyPairGenerator keyPairGen; keyPairGen KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048, new S…

Oracle Instant Client + PLSQL 部署终端PC远程连接数据库服务器简易操作

系统环境&#xff1a; 1、win7_64bit 2、instantclient_21_10 3、plsqldev1105_x64 4、远程Oracle数据库&#xff1a;Oracle11g R2 操作步骤&#xff1a; 1、下载好Oracle Instant Client 和PLSQL程序安装包&#xff1a; 1.1 Oracle Instant Client 官网&#xff1a;https://w…

MySQL基础(五)排序与分页

1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序 ORDER BY 子句在SELECT语句的结尾。 1.2 单列排序 SELECT last_name, job_id, department_id, hire_date FROM employees ORDER…

Redis之三大特殊数据类型:Geospatial:地理位置 hyperloglog:实现的功能是计算统计 bitmaps:位存储

三大特殊数据类型结构&#xff0c;十分的少见但是开源项目中依然有它们的身影 Geospatial:地理位置 实现的功能&#xff1a;附近的人&#xff0c;城市与城市之前的距离计算 添加城市经纬度到key中&#xff0c;经纬度则是key的value值&#xff0c;在正常的开发过程中&#xf…

获得 随机验证码(以图片为底层)

1&#xff1a;工具类 Slf4j public class RandomValidateCode {private static String baseNumLetter "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";private static String font "微软雅黑";//绘制验证码图片,返回验证码文本内容pu…

【机器学习】pytorch安装——环境配置(极简教程)

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 省流总结新建环境确定显卡型号安装显卡驱动安装pytorch国内镜像下载本地下载 验证安装成功 最近重新配置环境&#xff0c;简单记录一下。最近chatgpt等大语言模型和ai绘图火热&#xff0c;也为了方便很多…

视频剪辑必备的6个免费素材网站

做视频剪辑需要用到视频、音频、图片等素材&#xff0c;推荐几个网站&#xff0c;有免费、有付费&#xff0c;可根据需求自信选择~赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种…

电视机顶盒哪个牌子好?数码小编盘点电视机顶盒排行榜

电视机顶盒哪个牌子好&#xff1f;这是困扰新手们的一大难题&#xff0c;部分产品被爆出虚标高配、偷工减料&#xff0c;面对众多的机顶盒品牌和型号&#xff0c;怎么选择才好&#xff1f;小编以销量和用户评价为标准&#xff0c;盘点了电视机顶盒排行榜&#xff0c;跟着我一起…

Web端3D轻量化引擎基于PBR渲染——仿真模拟更逼真

HOOPS Communicator在2021版本中&#xff0c;推出了基于PBR&#xff08;Physically Based Rendering&#xff09;的渲染特性以提供更高质量的渲染技术。 PBR将材料表示为一系列方程&#xff0c;这些方程对光如何从表面反射进行建模&#xff0c;再通过GPU上运行的着色器代码进行…

MySQL基础(二)MySQL环境搭建

. MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话框&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现在“正在运行”状态&…

linux:命令grep查找关键字、wc统计以及管道符

linux:命令grep查找关键字、wc统计以及管道符 grep: wc: 输入wc test.txt时&#xff0c;输出了2 11 59 这三个数字 意思是:2行、11个单词(用空格分开就算一个单词)、59个字符(字节) ls -l看了看&#xff0c;也确实是59个字节。 通过wc的可选项来进行查看&#xff1a; 管道符…

成功解决:ubuntu下ifconfig不显示网卡信息

目录 前言方法一&#xff08;临时&#xff09;方法二第一步第二步第三步 前言 好久没动电脑虚拟机&#xff0c;今天打开ubuntu发现右上角没有网络图标&#xff0c;打开终端ping不同百度&#xff0c;再输入ifconfig发现不显示网卡信息&#xff0c;于是开始尝试各种方式&#xf…

11.软考——必考题型

1.必考题一------网络图 (1)完成项目的最少时间,肯定要最大最长的活动完成才算完成项目,因此找最长的路径:A->B->D->G->I->K->L 22天 (2)由于BD这条线就是处于最长的线,因此不能晚开始,晚开始就会导致整个项目都跟着晚。 (1)最长18 A--B…

Mysql 学习(八)单表查询方法二

复杂查询 上一节说了5种访问类型的查询&#xff0c;这一节就来说说关于这些比较复杂的查询 情况一&#xff1a;多个二级索引查询 sql&#xff1a;SELECT * FROM index_value_table WHERE value1 abc AND value2 > 1000;搜索条件&#xff1a; value1 等于 abcvalue2 大于…

tensorRT的完整安装以及常见错误 export failure: [WinError 127] 找不到指定的程序。

安装CUDA 查看本机适配的CUDA 版本 要想安装TensorRT必须要先安装CUDA和cudnn&#xff0c;那么首先需要去查看自己电脑的英伟达驱动程序程序&#xff0c;位置如下&#xff1a; NVIDIA控制面板->帮助->系统信息->组件&#xff0c;如下图所示本机适配CUDA版本为11.7 …

mongodb分片集群搭建

1.本次搭建使用三台centos7主机搭建伪集群&#xff0c;关闭防火墙和selinux服务 2.mongodb架构相当于9个分片节点&#xff0c;3个路由节点&#xff0c;3个配置节点&#xff0c;主机信息如下图所示 主机名称主机ip地址端口服务A10.1.60.11420001&#xff0c;21001&#xff0c;…