LeetCode题练习与总结:直线上最多的点数--149

一、题目描述

给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

示例 1:

输入:points = [[1,1],[2,2],[3,3]]
输出:3

示例 2:

输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出:4

提示:

  • 1 <= points.length <= 300
  • points[i].length == 2
  • -10^4 <= xi, yi <= 10^4
  • points 中的所有点 互不相同

二、解题思路

首先,我们需要明确两个点可以确定一条直线。因此,我们可以遍历所有点对,计算它们之间的斜率,如果斜率相同,则这两个点在同一条直线上。

为了计算斜率,我们可以使用数学中的公式:

斜率 k = (y2 - y1) / (x2 - x1)

为了避免除以0的情况,我们可以使用最大公约数(GCD)来简化分数。

算法步骤:

  1. 初始化一个HashMap,用于存储斜率和对应的点数。
  2. 遍历所有点对,计算它们之间的斜率。
  3. 如果斜率已经在HashMap中,则将对应的点数加1;否则,将斜率添加到HashMap中,并设置点数为1。
  4. 遍历HashMap,找到最大的点数,即为答案。

三、具体代码

import java.util.HashMap;

public class Solution {
    public int maxPoints(int[][] points) {
        int n = points.length;
        if (n <= 2) {
            return n;
        }
        
        int result = 0;
        for (int i = 0; i < n; i++) {
            HashMap<String, Integer> map = new HashMap<>();
            int duplicate = 0;
            int max = 0;
            for (int j = i + 1; j < n; j++) {
                int x = points[j][0] - points[i][0];
                int y = points[j][1] - points[i][1];
                
                if (x == 0 && y == 0) {
                    duplicate++;
                    continue;
                }
                
                int gcd = generateGCD(x, y);
                x /= gcd;
                y /= gcd;
                
                String key = x + "," + y;
                map.put(key, map.getOrDefault(key, 0) + 1);
                max = Math.max(max, map.get(key));
            }
            
            result = Math.max(result, max + duplicate + 1);
        }
        
        return result;
    }
    
    private int generateGCD(int a, int b) {
        if (b == 0) {
            return a;
        }
        return generateGCD(b, a % b);
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 外层循环遍历所有的点,共有n个点,因此外层循环的时间复杂度为O(n)。
  • 内层循环遍历除了当前点之外的所有点,因此内层循环的时间复杂度也为O(n)。
  • 在内层循环中,对于每一对点,我们需要计算它们的斜率,并简化为最简分数形式。计算最大公约数(GCD)的时间复杂度为O(log(m)),其中m是坐标值的最大差值。
  • 因此,内层循环中每一对点的处理时间复杂度为O(log(m))。
  • 综合以上分析,总的时间复杂度为O(n^2 * log(m))。
2. 空间复杂度
  • 我们使用了一个HashMap来存储斜率和对应的点数。在最坏的情况下,所有的点都在同一条直线上,此时HashMap中只有一个键值对。因此,空间复杂度为O(1)。
  • 但是,在计算过程中,我们使用了递归函数来计算最大公约数(GCD)。在最坏的情况下,递归的深度为O(log(m)),因此递归栈的空间复杂度为O(log(m))。
  • 综合以上分析,总的空间复杂度为O(log(m))。

综上所述,该算法的时间复杂度为O(n^2 * log(m)),空间复杂度为O(log(m))。

五、总结知识点

  1. 数组操作:使用二维数组points来存储点的坐标,其中points[i][0]points[i][1]分别表示第i个点的x坐标和y坐标。

  2. 循环结构:使用了两层循环来遍历所有点对,外层循环用于选取参考点,内层循环用于选取其他点。

  3. 散列表(HashMap):使用HashMap来存储直线的斜率(用字符串表示)和该斜率对应的点数。HashMap是一种关联数组,它允许我们以键值对的形式存储数据,并且可以快速检索数据。

  4. 最大公约数(GCD):使用了一个辅助函数generateGCD来计算两个整数的最大公约数。最大公约数是数学中的一个概念,用于简化分数。

  5. 斜率计算:计算两点之间的斜率,公式为(y2 - y1) / (x2 - x1)。为了避免除以0的情况,代码中使用了最大公约数来简化分数。

  6. 字符串操作:使用字符串来表示斜率,将xy坐标的比值转换为字符串形式,作为HashMap的键。

  7. 逻辑判断:使用条件语句(if)来判断两点是否重合,以及如何处理重合点。

  8. 数学运算:进行了整数除法、取余等基本数学运算。

  9. 递归:在计算最大公约数时,使用了递归函数。递归是一种常见的编程技巧,它允许函数调用自身。

  10. 函数默认值:在HashMapgetOrDefault方法中,如果键不存在,则返回一个默认值。

  11. 最大值追踪:使用变量max来追踪当前最大的点数,使用Math.max函数来更新最大值。

  12. 结果更新:使用变量result来存储最终的结果,并在每次内层循环结束后更新它。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

水箱高低水位浮球液位开关

水箱高低水位浮球液位开关概述 水箱高低水位浮球液位开关是一种用于监测和控制水箱中液位的自动化设备&#xff0c;它能够在水箱液位达到预设的高低限制时&#xff0c;输出开关信号&#xff0c;以控制水泵或电磁阀的开闭&#xff0c;从而维持水箱液位在一个安全的范围内。这类设…

STM32快速复习(八)SPI通信

文章目录 前言一、SPI是什么&#xff1f;SPI的硬件电路&#xff1f;SPI发送的时序&#xff1f;二、库函数二、库函数示例代码总结 前言 SPI和IIC通信算是我在大学和面试中用的最多&#xff0c;问的最多的通信协议 IIC问到了&#xff0c;一般SPI也一定会问到。 SPI相对于IIC多了…

3.js - 模板渲染 - 简单

3.js 真tm枯燥啊&#xff0c;狗都不学 效果图 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/li…

【数据结构】09.树与二叉树

一、树的概念与结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 根结点&#xff1a;根…

webGL可用的14种3D文件格式,但要具体问题具体分析。

hello&#xff0c;我威斯数据&#xff0c;你在网上看到的各种炫酷的3d交互效果&#xff0c;背后都必须有三维文件支撑&#xff0c;就好比你网页的时候&#xff0c;得有设计稿源文件一样。WebGL是一种基于OpenGL ES 2.0标准的3D图形库&#xff0c;可以在网页上实现硬件加速的3D图…

阶段三:项目开发---大数据开发运行环境搭建:任务2:安装配置ZooKeeper

任务描述 知识点&#xff1a;安装配置ZooKeeper 重 点&#xff1a; 安装配置ZooKeeper 难 点&#xff1a;无 内 容&#xff1a; ZooKeeper是一个开源分布式协调服务&#xff0c;其独特的Leader-Follower集群结构&#xff0c;很好的解决了分布式单点问题。目前主要用于诸…

IT之家最新科技热点 | 小米 AI 研究院开创多模态通用模型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

一.2.(3)放大电路的图解分析方法和微变等效电路分析方法;

放大电路的主要分析方法:图解法、微变等效电路法 这里以共射放大电路为例 (1) 图解法: 1.静态分析 首先确定静态工作点Q,然后根据电路的特点,做出直流负载线,进而画出交流负载线,最后,画出各极电流电压的波形。求出最大不失真输出电压。 估算IBQ&#xff0c;然后根据数据手册里…

二分查找2

1. 山脉数组的峰顶索引&#xff08;852&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 根据题意我们可以将数组分为两个部分&#xff0c;一个部分是arr[mid-1]<arr[mid]&#xff0c;另一个部分为arr[mid-1]>arr[mid]&#xff0c;此时不难发现我们可以将二分…

U.S.News发布全美最佳本科AI专业排名

10 加州大学圣迭戈分校 University of California, San Diego UCSD的人工智能项目从事广泛的理论和实验研究&#xff0c;学校的优势领域包括机器学习、不确定性下的推理和认知建模。除了理论学习&#xff0c;UCSD教授非常注重把计算机知识运用到自然语言处理、数据挖掘、计算…

从模拟到预测,从智能到智慧:数字孪生技术在水库管理中的应用演变,推动水利行业向更高层次的智慧化迈进

目录 引言 一、数字孪生技术概述 二、数字孪生技术在水库管理中的应用演变 1. 从模拟到预测&#xff1a;构建精准的数字孪生模型 2. 从智能到智慧&#xff1a;实现全面感知与精准控制 3. 推动公众参与与透明化管理 三、数字孪生技术推动水利行业向更高层次的智慧化迈进 …

密室逃脱——收集版修改测试

一、原版修改 1、导入资源 Unity Learn | 3D Beginner: Complete Project | URP 2、设置Scene 删除SampleScene&#xff0c;打开UnityTechnologies-3DBeginnerComplete下的MainScene 3、降低音量 (1) 打开Hierarchy面板上的Audio降低音量 (2) 打开Prefabs文件夹&#xf…

推荐3款【王炸级别】的效率软件,免费无广告,你一定要收藏

Temp Cleaner Temp Cleaner 是一款专为 Windows 操作系统设计的临时文件清理工具。它的主要功能是安全且快速地清理磁盘上的临时文件和系统缓存&#xff0c;从而释放磁盘空间。该软件体积小巧&#xff08;仅有826KB&#xff09;&#xff0c;并且是无广告的绿色软件&#xff0c;…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…

初学Spring之 AOP 面向切面编程

AOP&#xff08;Aspect Oriented Programming&#xff09;面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 是面向对象&#xff08;OOP&#xff09;的延续 AOP 在 Spring 中的作用&#xff1a; 1.提供声明式事务 2.允许用户自定义切面 导…

Java 基础--File - IO流(2)

I/O流 定义 数据从硬盘流向内存为输入流&#xff0c;数据从内存流向硬盘为输出流。输入也叫读取数据&#xff0c;输出也叫写出数据。 IO分类 1.按照数据的流向分为&#xff1a;输入流和输出流 ①输入流&#xff1a;把数据从其他设备上读取到内存中的流 ②输出流&#xff1…

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代&#xff0c;pdf文件转换成图片格式是一种常见的操作&#xff0c;无论是在工作还是日常生活中&#xff0c;我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么&#xff0c;如何高效地将pdf转换成图片呢&#xff1f;本文…

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT 对话情绪识别

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT对话情绪识别 近期确实太忙&#xff0c;此处仅作简单记录&#xff1a; 模型简介 BERT全称是来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;&#xff0c…

#数据结构 顺序表

线性表 顺序表 每种结构都有它存在意义 线性表的顺序存储实现指的是用一组连续的存储单元存储线性表的数据元素。 概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性表&#xff0c;一般情况下采用数组存储。在数组上完成数据的增查改删。 逻辑结构&#…

阶段三:项目开发---大数据开发运行环境搭建:任务8:安装配置Redis

任务描述 知识点&#xff1a;安装配置Redis 重 点&#xff1a; 安装配置Redis 难 点&#xff1a;无 内 容&#xff1a; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可…