3102.力扣每日一题7/9 Java(TreeMap)

news2024/9/24 3:20:29
  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

 

 

目录

TreeMap详解

解题思路

解题方法

时间复杂度

空间复杂度

Code 


TreeMap 详解

TreeMap 是 Java 中的一种数据结构,属于 Map 接口的实现类之一。

主要特点:

  1. 有序性TreeMap 中的键是按照自然顺序(对于实现了 Comparable 接口的键)或者自定义的比较器所定义的顺序进行存储和排序的。这使得遍历 TreeMap 时能按照特定的顺序获取键值对。
  2. 底层结构:其底层基于红黑树实现,红黑树是一种自平衡的二叉搜索树,保证了插入、删除和查找操作的平均时间复杂度为 ,其中 n 是键的数量。
  3. 键的要求:键必须是可比较的。如果键的类型没有实现 Comparable 接口,那么在创建 TreeMap 时必须提供一个自定义的比较器。

常见操作和方法:

  1. put(K key, V value):向 TreeMap 中添加键值对。
  2. get(Object key):根据给定的键获取对应的值。
  3. containsKey(Object key):检查 TreeMap 是否包含指定的键。
  4. firstKey():返回 TreeMap 中的第一个键。
  5. lastKey():返回 TreeMap 中的最后一个键。
  6. lowerKey(K key):返回小于指定键的最大键。
  7. higherKey(K key):返回大于指定键的最小键。

应用场景:

  1. 当需要按照键的特定顺序进行存储和访问时,例如需要对键进行有序遍历。
  2. 当需要快速查找特定范围内的键值对时,利用其有序性和相关的方法(如 subMap )。

总的来说,TreeMap 提供了有序存储和操作键值对的功能,适用于对数据顺序有要求的场景。但在某些情况下,如果不关心顺序,使用 HashMap 可能在性能上更有优势,因为其操作的平均时间复杂度更低。

解题思路

首先,使用两个 TreeMap(xs 和 ys)分别对所有点的 x + y 和 y - x 的值进行计数。
然后通过遍历每个点,模拟移除该点后更新 TreeMap 中的计数。
计算更新后的 TreeMap 中键的最大值和最小值的差值(dx 和 dy),并与当前的最小最大距离 ans 进行比较和更新。

解题方法

  1. 初始化阶段:

    • 创建两个 TreeMap 对象 xs 和 ys
    • 遍历输入的点数组 points ,对于每个点 p ,计算 x = p[0] + p[1] 和 y = p[1] - p[0] 。
    • 使用 merge 方法将 x 和 y 及其出现次数累加到对应的 TreeMap 中。如果 x 或 y 已经存在,就将其计数加 1;如果不存在,就初始化为 1。
  2. 核心处理阶段:

    • 初始化最小最大距离 ans 为 Integer.MAX_VALUE 。
    • 再次遍历点数组 points 。
    • 对于每个点,重新计算其对应的 x 和 y 。
    • 检查 xs 中 x 的计数:
      • 如果计数为 1 ,则从 xs 中移除 x 。
      • 如果计数大于 1 ,则将其计数减 1 。
    • 对 ys 中 y 进行类似的处理。
    • 计算 xs 中最大键值和最小键值的差值 dx ,以及 ys 中最大键值和最小键值的差值 dy 。
    • 取 dx 和 dy 中的最大值,与当前的 ans 比较并更新 ans 为较小值。
    • 最后,如果 x 不在 xs 中,就将其添加并初始计数为 1 ;否则将其计数加 1 。对 y 在 ys 中的处理也是类似的。
  3. 最终返回 ans ,即恰好移除一个点后任意两点之间最大距离可能的最小值。

时间复杂度

  • 初始化 TreeMap 的时间复杂度为O(n) ,其中 n 是点的数量。
  • 对每个点进行处理的时间复杂度为O(n log n) ,因为涉及到对 TreeMap 的操作。
  • 总的时间复杂度为 O(n²log n)

空间复杂度

使用了两个 TreeMap 来存储点的相关信息,空间复杂度为 O(n)

Code

import java.util.TreeMap;

class Solution {
    public int minimumDistance(int[][] points) {
        TreeMap<Integer, Integer> xs = new TreeMap<>();
        TreeMap<Integer, Integer> ys = new TreeMap<>();
        for (int[] p : points) {
            int x = p[0] + p[1];
            int y = p[1] - p[0];
            xs.merge(x, 1, Integer::sum);
            ys.merge(y, 1, Integer::sum);
        }

        int ans = Integer.MAX_VALUE;
        for (int[] p : points) {
            int x = p[0] + p[1];
            int y = p[1] - p[0];
            if (xs.get(x) == 1) {
                xs.remove(x);
            } else {
                xs.merge(x, -1, Integer::sum);
            }
            if (ys.get(y) == 1) {
                ys.remove(y);
            } else {
                ys.merge(y, -1, Integer::sum);
            }

            int dx = xs.lastKey() - xs.firstKey();
            int dy = ys.lastKey() - ys.firstKey();
            ans = Math.min(ans, Math.max(dx, dy));

            if (!xs.containsKey(x)) {
                xs.put(x, 1);
            } else {
                xs.merge(x, 1, Integer::sum);
            }
            if (!ys.containsKey(y)) {
                ys.put(y, 1);
            } else {
                ys.merge(y, 1, Integer::sum);
            }
        }
        return ans;
    }
}

穷不失义,达不离道。——孔丘《论语》

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

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

相关文章

打卡第8天-----字符串

进入字符串章节了,我真的特别希望把leetcode上的题快点全部都给刷完,我是社招准备跳槽才选择这个训练营的,面试总是挂算法题和编程题,希望通过这个训练营我的算法和编程的水平能有所提升,抓住机会,成功上岸。我现在的这份工作,真的是一天都不想干了,但是下家工作单位还…

jmeter-beanshell学习7-props获取全局变量和设置全局变量

继续写点不痛不痒的小东西。第一篇写了vars设置变量&#xff0c;但是vars只能作用在同一个线程组。跨线程组情况比较少&#xff0c;要是用到跨线程组&#xff0c;有个pros&#xff0c;用法和vars一样。 在setup线程组设置变量a&#xff0c;执行的时候&#xff0c;jmeter会先执行…

【HarmonyOS】关于官方推荐的组件级路由Navigation的心得体会

前言 最近因为之前的630版本有点忙&#xff0c;导致断更了几天&#xff0c;现在再补上。换换脑子。 目前内测系统的华为应用市场&#xff0c;各种顶级APP陆续都放出来beta版本了&#xff0c;大体上都完成了主流程的开发。欣欣向荣的气息。 学习思路 关于学习HarmonyOS的问题…

ApiFox或postman怎么用params类型传输json或集合+json的String类型

你是否碰见过这样的接口? post请求然后传输的参数都要和查询时一样以param形式传参数,那String什么的都好说,传就直接进后台了,那json呢,集合呢,是不是直接给你返400呢. 1.传json如何处理 那我们看看怎么实现,如果你要传json数据,那需要将特殊字符转义,也叫url转码,否则传不…

BeanUtils.copyProperties到底坑了多少人?

今儿我们就来梳理一下BeanUtils.copyProperties的坑点&#xff01;&#xff01; 一、坑点全解析 1. 类型不匹配 2. 属性命名差异 例如&#xff1a; 3. Boolean类型和is属性开头的坑 使用Lombok生成的getter方法时&#xff0c;如果Boolean类型的属性以is开头&#xff0c;Bea…

PHP工单预约表单系统小程序源码

&#x1f527;【高效办公新利器】工单预约表单系统大揭秘 &#x1f4bc;【一键提交&#xff0c;工单管理新高度】 你还在为繁琐的工单提交流程头疼吗&#xff1f;工单预约表单系统&#xff0c;让你的工单管理步入高效时代&#xff01;只需简单几步&#xff0c;填写必要信息&a…

Qt(四)事件

文章目录 一、概念二、&#xff08;一&#xff09;&#xff08;二&#xff09;QImage类&#xff08;三&#xff09;鼠标事件和键盘事件1. 鼠标事件2. 键盘事件 &#xff08;四&#xff09;定时器事件1. 采用定时器事件2. QTimer定时器类 三、 一、概念 事件是由窗口系统或者自…

Java getSuperclass和getGenericSuperclass

1.官方API对这两个方法的介绍 getSuperclass : 返回表示此 Class 所表示的实体&#xff08;类、接口、基本类型或 void&#xff09;的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void&#xff0c;则返回 null。如果此对象表示一个数组类&#xff…

VSCode升级后不能打开在MacOS系统上

VSCode 在MacOS无法打开 版本 VSCode version: 1.91.0 (x64) 错误信息&#xff1a; MacBook-Pro ~ % /Users/mac/Downloads/FirefoxDownloads/Visual\ Studio\ Code.app/Contents/MacOS/Electron ; exit; [0710/142747.971951:ERROR:crash_report_database_mac.mm(753)] op…

做突破交易时,需要注意的进场细节有哪些?

突破交易揭示了市场未来的走向。 在这种情况下&#xff0c;面对市场时我们应该如何入场操作呢&#xff1f;接下来&#xff0c;让我们来细化一下实施的具体步骤。 01. 在交易中&#xff0c;周期的考量比价格突破更为关键。 当价格突破发生时&#xff0c;市场的平静被打破&#x…

编译执行JAVA含中文字符串文件,终端输出乱码问题处理

Date: 2024.07.10 20:42:07 author: lijianzhan 关于使用JDK21,编译执行JAVA含中文字符串文件&#xff0c;终端输出乱码怎么解决的问题&#xff0c;这篇文章将简单的描述一下问题&#xff0c;解决过程&#xff0c;结果。使用的解决方式是使用IDEA编辑器中的运行调试配置&#…

位运算在数据库中的运用实践-以MySQL和PG为例

目录 前言 一、两种不同的数据库设计 1、状态字段存储JSON 2、使用位运算 二、数据库中的位运算实践 1、MySQL中的位运算实践 2、PostgreSQL中位运算实践 三、总结 前言 最近在解决某用户的一个业务需求时&#xff0c;遇到一个很有意思的场景。首先先跟大家分享一下需求…

ts语法---泛型和泛型约束

泛型 泛型&#xff0c;动态类型&#xff0c;是一个初始化不明确的类型&#xff0c;类似于函数中的形参&#xff08;不明确参数值&#xff09;&#xff0c; 泛型一般用在function定义函数时动态约束类型&#xff0c;和type定义类型时动态约束类型&#xff0c; 泛型一般使用任…

中小学校园EasyCVR视频综合监管方案:构建安全、智能的校园环境

一、背景需求分析 随着科技的快速发展&#xff0c;校园安全问题日益受到社会各界的关注。尤其是在中小学校园中&#xff0c;学生的安全更是牵动着每一个家庭的心。为了更有效地保障学生的安全&#xff0c;提高校园安全管理水平&#xff0c;视频监控系统在中小学中的应用越来越…

1.10编程基础之简单排序--02:奇数单增序列

OpenJudge - 02:奇数单增序列http://noi.openjudge.cn/ch0110/02/ 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入 共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。 输出 增序输出的奇数序列,数据之间以逗号间隔。数…

华为od100问持续分享-1

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2024年5月份开始&#xff0c;考的都是OD统一考试&#xff08;D卷&#xff09;&#xff0c;题库已经整…

GDidees CMS v3.9.1 本地文件泄露漏洞(CVE-2023-27179)

前言 CVE-2023-27179 是一个影响 GDidees CMS v3.9.1 及更低版本的任意文件下载漏洞。这个漏洞存在于 /_admin/imgdownload.php 文件中&#xff0c;攻击者可以通过向 filename 参数传递恶意输入来下载服务器上的任意文件。 漏洞的根源在于对用户输入的 filename 参数处理不当…

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式&#xff08;多对多、多表查询、子查询等&#xff09;。 一、 前端界面需要展现多个表的其中几个数据的多表查询。1. 三个表查询其中字段返回&#xff1a;&#xff08;用一下sql语句&#xff…

scipy库中,不同应用滤波函数的区别,以及FIR滤波器和IIR滤波器的区别

一、在 Python 中&#xff0c;有多种函数可以用于应用 FIR/IIR 滤波器&#xff0c;每个函数的使用场景和特点各不相同。以下是一些常用的 FIR /IIR滤波器应用函数及其区别&#xff1a; from scipy.signal import lfiltery lfilter(fir_coeff, 1.0, x)from scipy.signal impo…

数据结构——约瑟夫环C语言链表实现

约瑟夫环问题由古罗马史学家约瑟夫&#xff08;Josephus&#xff09;提出&#xff0c;他参加并记录了公元66—70年犹太人反抗罗马的起义。在城市沦陷之后&#xff0c;他和40名死硬的将士在附近的一个洞穴中避难。起义者表示“宁为玉碎不为瓦全”&#xff0c;约瑟夫则想“留得青…