【LeetCode】149. 直线上最多的点数

news2024/11/24 16:39:50

149. 直线上最多的点数(困难)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

枚举直线 + 哈希表统计

思路

  • 遍历每两个点之间的连线,然后计算这条连线上有多少个点
    具体步骤如下:

    1. 初始化最大点数为 0。
    2. 遍历每个点,用它和其他点计算斜率。
    3. 如果两个点的x坐标相同,斜率设为INT_MAX;否则,计算斜率,即两个点的y 差值除以 x 差值。
    4. 使用一个哈希表mp来记录每个斜率对应的点的个数,初始值为2(两个点)。
    5. 遍历其他点,如果它们和当前点的斜率相同,则将对应斜率的点数加1。
    6. 更新最大点数为mp中的最大值。
    7. 返回最大点数。
  • 为了避免重复计算,使用一个 flag 数组来标记已经处理过的点。在内层循环中,如果一个点已经被标记过,则直接跳过。

  • 这个思路的时间复杂度为O(n2),因为需要两重循环来遍历所有的点对。

  • 缺点:在每次遍历点集之前都创建了一个新的 flag 数组和 mp 哈希表,这样会导致重复的计算

易错点

  1. 错误处理斜率不存在(即两个点横坐标相同)的情况,将 k 标记为 0;
  2. 斜率可能为浮点数,一开始也标记为 int ;
  3. 一开始将 flag 数组 和 mp 哈希表放在大循环外边,导致有些点没有计算到。

代码

class Solution {
public:
    int maxPoints(vector<vector<int>>& points) {
        int n = points.size();
        if(n < 3)   return n;
        int maxPoint = 0;
        
        for(int i=0; i<n-1; ++i){
            vector<int> flag(n, 0);
            unordered_map<double, int> mp;
            if(flag[i]) continue;
            flag[i] = 1;
            for(int j=i+1; j<n; ++j){
                if(flag[j]) continue;
                flag[j] = 1;
                double k;
                // 斜率=0
                if(points[j][0] == points[i][0]) k = INT_MAX;
                else k = (double)(points[j][1] - points[i][1]) / (double)(points[j][0] - points[i][0]);
                mp[k] += 2;
                for(int p=j+1; p<n; ++p){
                    if(flag[p]) continue;
                    // 在同一条直线上
                    if(points[p][0] == points[j][0] && k == INT_MAX){
                        flag[p] = 1;
                        mp[k] ++;
                    }
                    if(((double)(points[p][1] - points[j][1]) / (double)(points[p][0] - points[j][0])) == k){
                        flag[p] = 1;
                        mp[k] ++;
                    }
                }
            }
            for(auto key : mp){
                maxPoint = max(maxPoint, key.second);
            }
        }

        return maxPoint;
    }
};

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

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

相关文章

7月大概率加息25bp!美股螺旋式下跌,加密市场“迎难而上”!

今年6月&#xff0c;美股标普500指数走出了自1948年以来最长的熊市&#xff0c;进入新的牛市&#xff0c;美联储暂停加息给全球资本市场一个喘息的机会。尽管如此&#xff0c;美国目前经济基本面的情况仍不及预期&#xff0c;股市其上涨态势恐怕将会迎来一轮调整。 以Solita Ma…

资深开发竟然不清楚int(1)和int(10)的区别

一、困惑 最近遇到个问题&#xff0c;有个表的要加个user_id字段&#xff0c;user_id字段可能很大&#xff0c;于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单&#xff0c;于是说&#xff1a;这int(1)怕是不够用吧&#xff0c;接下来是一通解释。…

做一个小程序需要多少钱

做一个小程序要多少钱&#xff0c;这种分2种类型 定制版 定制版就是按着客户的需求来做了。首先是聊需求&#xff0c;然后画思维导图&#xff0c;做原型图&#xff0c;做完原型图&#xff0c;就是做UI设计&#xff0c;然后做前端&#xff0c;后端。这个费用下来大概几千元到几…

Rust 第五天—代码组织管理

通过之前的内容介绍,对Rust或多或少有了一些了解.也许现在还不能写出“像样子”的项目,但是把大量代码堆积写在一个文件中依旧是不可取的.今天的内容相对轻松一些,聊聊Rust的包和模块 Rust的模块系统可以划分为Package,Crate,Module,具体可以总结如下: Package:整个项目Crate…

【hadoop】Linux安装和配置

安装 RedHat Linux 7.4 创建新的虚拟机 选择“自定义&#xff08;高级&#xff09;” 选择“下一步” 选择“稍后安装操作系统” 选择操作系统的类型 设置虚拟机名称和保存路径 下一步 下一步 设置网络类型&#xff0c;选择“使用仅主机模式网络” 下一步 下一步 下一步 设置硬…

pytorch笔记:归一化

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN layer normalization 是针对单个样本&#xff0c;训练和测试的时候行为一致LN 相对于 BN 更适合 RNN&#xff0c;可以降低训练时间LN 中不同样本有不同的归一化参数&#xff0c;以层计算 a 是输入&#xff0c;f 是每层具…

【LeetCode周赛】2022上半年题目精选集——思维题

文章目录 2211. 统计道路上的碰撞次数&#xff08;栈 || 脑筋急转弯&#xff09;解法1&#xff1a;自己想的——使用栈解法2——思维&#xff1a;去掉左右两边往左右开的车代码写法1——找左右端点代码写法2——正则表达式去除流处理api补充&#xff1a;replaceAll() 和 正则表…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述&#xff1a; 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”&#xff0c;同步转载于此。 背景 源码&#xff1a;…

8、动手学深度学习——现代卷积神经网络:AlexNet

1、学习表征 在2012年前&#xff0c;图像特征都是机械地计算出来的。事实上&#xff0c;设计一套新的特征函数、改进结果&#xff0c;并撰写论文是盛极一时的潮流 另一组研究人员&#xff0c;包括Yann LeCun、Geoff Hinton、Yoshua Bengio、Andrew Ng、Shun ichi Amari和Juer…

Java阶段四Day11

Java阶段四Day11 文章目录 Java阶段四Day11Spring AOPElasticsearch1. 关于各种数据库的使用2. 关系型数据库中的索引3. 安装与启动elasticsearch4. 访问elasticsearch5. 使用elasticsearch分词6. elasticsearch文档的相关概念7. 使用elasticsearch添加数据7.1. 添加文档7.2. 查…

Spring Boot 中的分布式追踪及使用

Spring Boot 中的分布式追踪及使用 随着互联网应用程序的复杂性不断增加&#xff0c;分布式系统已经成为了许多企业级应用程序的标配。在分布式系统中&#xff0c;由于服务之间的调用关系错综复杂&#xff0c;很难追踪到一个请求在整个系统中的执行路径和时间&#xff0c;这就…

Python如何提高工作效率,轻松实现读取分数,计算出最高/低分

前言 Python如何读取分数&#xff0c;计算最高/低分 与平均分&#xff1f; 今天这篇文章就来带你学习学习如何实现这个功能~ 环境使用: Python 3.8 解释器 Pycharm 编辑器 涉及知识点 文件读写基础语法字符串处理循环遍历 代码展示 模块 import platform定义获取最高分、最…

AI 语音 - 人声歌曲合成

前情提要 2023-07-02 周日 杭州 阴晴不定 小记: 天生五音不全&#xff0c;唱歌永远找不到调&#xff0c;使用下 AI 通过音色合成下吧&#xff0c;目前才训练 15000 步左右&#xff0c;我准备的数据集其实满打满算也只有 40min 左右的数据集&#xff0c;为了数据预处理有删减了…

基于openvino+yolov5的模型量化记录(PTQ模式)

本文主要是记录学习openvino_notebootk 302-pytorch-quantization-aware-training文档的一些收获&#xff0c;对于yolov5在cpu部署感兴趣的可以参考下。 此文档的目的是为了了解openvino如何降低模型部署的推理时间&#xff0c;同时尽可能保证精度。 此文档一共提供了两种PT…

【Flutter】Flutter 使用 Stream Transform 包处理流操作

文章目录 一、 前言二、 Stream Transform 包简介三、 安装和版本信息四、 Stream Transform 的基本使用1. 扩展方法2. 异步映射 五、 示例&#xff1a;使用 Stream Transform 实现实时搜索功能六、 总结 一、 前言 欢迎来到我的博客&#xff01;我是小雨青年&#xff0c;这是…

基于docker的ubuntu云服务器jupyter深度学习环境配置指南

step1 安装docker 文档中的命令如下&#xff1a; sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings…

驱动 控制开发版3盏灯、蜂鸣器、风扇、马达

head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; //查看开发扩展板原理图可知 //蜂鸣器 PB6 //风扇 PE9 //马达 PF6 //LED1 PE…

商用车线控底盘需求文档

一、 概述 商用车线控底盘主要用于接收智能驾驶域控制器&#xff08;控制器ADU&#xff09;的请求指令&#xff0c;完成ADU 对驱动、制动、档位转向、驻车声光等部分的指令控制&#xff0c;从而实现智能驾驶功。 即 ADU 可通过 CAN 通讯的方式以特定周期和指令控制 一台车的线控…

驱动开发作业2 —— ioctl

通过ioctl函数选择不同硬件的控制&#xff0c;如实现对LED、蜂鸣器、马达、风扇的控制 1.将GPIO的相关寄存器封装成结构体 --------> gpio.h 2.LED相关驱动文件 --------> led.c 3.蜂鸣器相关驱动文件 --------> beep.c 4.风扇相关驱动文件 --------> fan.c 5.马…