数学结论在dsa中的应用

news2024/11/16 11:24:59

1. LC 3102 最小化曼哈顿距离

VP周赛391 T4。这是个结论题目。

首先曼哈顿距离是需要两个数对而不是两个数去进行比较的,两个数之间你很轻易就知道差的绝对值最大是多少了,只要挑最大和最小两个数一减就可以了。

但是两个数对之间各项差的绝对值之和最大是多少就不好说了。假设第一个数对的第一项是所有第一项里最大的,第二个数对的第一项是所有第一项里最小的,他俩之间的曼哈顿距离不一定是最大的。所以就很难比。

这就引入了切比雪夫距离。

refs(from 0x3f的题解):

<https://leetcode.cn/problems/minimize-manhattan-distances/solutions/2716755/tu-jie-man-ha-dun-ju-chi-heng-deng-shi-b-op84>

将整个坐标系顺时针旋转45°,然后扩大根号二倍,则原坐标系上任意一点(x,y)的坐标变为(x’,y’)=(x+y,y-x)。

推导过程如下:

假设旋转矩阵为R
假设扩大矩阵为S
则transpose(x',y') = SR*transpose(x,y)

旋转矩阵:
1. 对于点(1,0),顺时针旋转45°,变成了(1/sqrt(2),-1/sqrt(2))
2. 对于点(0,1),顺时针旋转45°,变成了(1/sqrt(2),1/sqrt(2))
所以旋转矩阵为
[
	[ 1/sqrt(2),1/sqrt(2) ]
	[ -1/sqrt(2),1/sqrt(2) ]
]

扩大矩阵:
1. 对于点(1,0),扩大根号二倍,变成了(sqrt(2),0)
2. 对于点(0,1),扩大根号二倍,变成了(0,sqrt(2))
所以扩大矩阵为
[
	[ sqrt(2),0 ]
	[ 0,sqrt(2) ]
]

这样SR为
[
	[ 1,1 ]
	[-1,1 ]
]

所以(x',y') = (x+y,-x+y)

当我们把操作后的坐标投影到原先坐标系的x轴或y轴上后,原先两个点之间的距离,就变成了投影在x/y轴上的距离,这是因为投影把线段缩小到原来的1/sqrt(2)倍,正好和扩大sqrt(2)倍兑掉了。

如下图,红色线段是欧式距离,深蓝色线段是曼哈顿距离,灰色射线是新坐标系x轴和y轴,黑色射线是原坐标系x轴和y轴,橙色线段是切比雪夫距离,就等于原坐标系的曼哈顿距离,也就是橙色线段的长度等于左边图中两条深蓝色线段的长度。

这样就做了一个很nb的事情,我们把原先二维点对的距离给降维了,变成一维的了,这样就能选一个最大值,选一个最小值,然后相减得到最大的绝对值。

需要注意的是,有时候投影完的距离会是原先两个折线长度的差而不是和,比如上图中如果投影到y会发现切比雪夫距离是2-1=1而不是3。解决这个问题的方式就是我们把投影到x和投影到y轴上的两个线段的长度取一个较大值,这样就是切比雪夫距离了。

java没有sortedList,所以可以TreeMap来维护,一个专门用来存新坐标系下的x坐标,一个存新坐标系下的y的坐标。然后枚举被删除的,从剩下的里面挑一个最大的,一个最小的,相减,更新答案。记得最大最小都要各自选x和y,然后相减完取个较大值作为切比雪夫距离。

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[] point : points) {
            int x = point[0];
            int y = point[1];

            xs.merge(x+y,1,Integer::sum);
            ys.merge(y-x,1,Integer::sum);
        }

        int ans = Integer.MAX_VALUE;
        for (int[] point : points) {
            int x = point[0];
            int y = point[1];

            int x_ = x + y;
            int y_ = y - x;

            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);
            }

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

            xs.merge(x_,1,Integer::sum);
            ys.merge(y_,1,Integer::sum);
        }

        return ans;
    }
}

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

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

相关文章

了解以太坊虚拟机(EVM)

了解以太坊虚拟机&#xff08;EVM&#xff09; 以太坊虚拟机&#xff08;Ethereum Virtual Machine&#xff0c;简称EVM&#xff09;是以太坊网络的核心组件之一&#xff0c;它承担着智能合约执行的重要任务 特点 智能合约执行环境&#xff1a;EVM提供了一个安全的环境&#xf…

【C++STL详解 —— vector的介绍及使用】

【CSTL详解 —— vector的介绍及使用】 vector的介绍vector的使用vector的构造vector iterator 的使用begin和endrbegin和rend vector 空间增长问题size和capacityreserve和resizeempty vector 增删查改push_back和pop_backinsert和erasefindswap元素访问 vector 迭代器失效问题…

案例:非功能性需求的设计

在咨询中看到很多项目组对于非功能性需求没有做设计&#xff0c;很多项目组在设计文档中仅仅是把非功能性需求的描述拷贝到设计文档的非功能性章节。因此特地设计了两个简单的需求给大家参考&#xff0c;希望能够引导设计人员重视非功能性需求的设计。

软件设计师-案例分析2

文章目录 除09-1520上-结构化分析20上-数据库分析20上-面向对象分析与设计 除09-15 20上-结构化分析 问题1&#xff1a; 问题2&#xff1a; 问题3&#xff1a; 问题4&#xff1a; 回答1&#xff1a;E1检测设备&#xff1b; E2管理员&#xff1b;E3检测业务员&#xff1b;…

Java多态世界(day18)

多态&#xff1a;重写的方法调用和执行 1.静态绑定&#xff1a;编译器在父类中找方法&#xff0c;如&#xff1a; 上面的eat&#xff08;&#xff09;方法是先在父类中找方法&#xff0c;父类没有的话&#xff0c;就算子类有编译也会报错。&#xff08;如果引用方法在父类中存…

HashMap为啥线程不安全?

1. HashMap1.7在多线程并发下扩容时&#xff0c;头插法会出现环。 /*** Rehashes the contents of this map into a new array with a* larger capacity. This method is called automatically when the* number of keys in this map reaches its threshold.** If current cap…

使用Detours进行HOOK

文章目录 Detours介绍Detours配置Detours进行Sleep Hook Detours介绍 Detours是微软研究院开发的一款软件工具&#xff0c;用于Windows平台上的应用程序重定向和修改。 它可以在运行时修改应用程序的执行路径&#xff0c;允许开发人员注入自定义代码来改变应用程序的 行为&…

STM32 定时器外部时钟与循迹模块

1、上篇文章介绍了定时器使用内部时钟信号计数&#xff0c;实现计数、更新中断等功能。 2、可不可以利用定时器对来自外部的信号进行计数&#xff1f;也就是对输入io的信号计数&#xff1f; 3、可以 1、定时器外部时钟 STM32的通用定时器和高级定时器都将外部信号引入…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展&#xff0c;链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅&#xff0c;对这些领域进行详细解析&#xff0c;探讨它们的意义、应用场景以及未来发展趋势。 链游开发&#xff08;Bl…

每日面经分享(python进阶 part2)

Python中的装饰器和上下文管理器区别是什么&#xff1f;它们分别适用于哪些场景&#xff1f; a. 装饰器用于在函数或类的外部添加额外功能&#xff0c;而上下文管理器用于管理资源的获取和释放。 b. 装饰器是一种用于修改函数或类行为的技术。适用于需要在函数或类的外部添加额…

Electron 打包自定义NSIS脚本为安装向导增加自定义页面增加输入框

Electron 打包工具有很多&#xff0c;如Electron-build、 Electron Forge 等&#xff0c;这里使用Electron-build&#xff0c;而Electron-build使用了nsis组件来创建安装向导&#xff0c;默认情况nsis安装向导不能自定义安装向导界面&#xff0c;但是nsis提供了nsis脚本可以扩展…

YOLO火灾烟雾检测数据集:20000多张,yolo标注完整

YOLO火灾烟雾检测数据集&#xff1a;一共20859张图像&#xff0c;yolo标注完整&#xff0c;部分图像应用增强 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或其他任何数据集请私信

kubadm部署kubernetes

什么是kubernetes Kubernetes是一款应用于集群的&#xff0c;容器自动部署、扩展和管理的开源平台&#xff0c;提供了一种以容器为中心的基础架构。利用kubernetes&#xff0c;你可以快速高效地响应客户如下请求&#xff1a; 应用程序的动态、精准部署应用程序的动态扩展无缝推…

vscode + wsl1 搭建远程C/C++开发环境

记录第一次搭建环境过程。 搭建C/C开发环境有很多种方式&#xff0c;如 MinGW vscode&#xff08;MinGW 是GCC的Windows版本&#xff0c;本地编译环境&#xff09;SSH隧道连接 vscode&#xff08;远程Linux主机&#xff09;wsl vscode&#xff08;远程Linux环境&#xff09…

第14章 数据结构与集合源码

一 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 战术和策略&#xff1a;数据结构 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 …

GPT4不限制使用次数了!GPT5即将推出了!

今天登录到ChatGPT Plus账户&#xff0c;出现了如下提示&#xff1a; 已经没有了数量和时间限制的提示。 更改前&#xff1a;每 3 小时限制 40 次&#xff08;团队计划为 100 次&#xff09;&#xff1b;更改后&#xff1a;可能会应用使用限制。 GPT-4放开限制 身边订阅了Ch…

C语言——字符串函数

一.前言 我们在日常写代码的过程中&#xff0c;经常会对字符串进行处理的过程。而在C语言中的<string.h>中&#xff0c;包含了众多字符串函数&#xff0c;我们可以借助这些字符串函数来对其进行各种操作。 二.strlen函数 strlen函数的作用是求出所传字符串的长度。该函…

图片改大小尺寸怎么改?几个修改图片尺寸的方法

日常生活和工作中&#xff0c;图片的大小和尺寸对于我们的工作和生活都至关重要&#xff0c;因此我们经常需要调整图片的大小。我们都知道压缩图是一款功能强大的图片在线处理工具&#xff0c;那么用它怎么调整图片大小呢&#xff1f;下面就让我们一起来看一下具体的操作步骤。…

网络与并发编程(二)

线程_信号量 互斥锁使用后&#xff0c;一个资源同时只有一个线程访问。如果某个资源&#xff0c;我们同时想让N个(指定数值)线程访问&#xff1f;这时候&#xff0c;可以使用信号量。 信号量控制同时访问资源的数量。信号量和锁相似&#xff0c;锁同一时间只允许一个对象(进程…

Python项目21:一个简单的记账系统(收入+支出+查询)

------------★Python练手项目源码★------------ Python项目源码20&#xff1a;银行管理系统&#xff08;开户、查询、取款、存款、转账、锁定、解锁、退出&#xff09; Python项目19&#xff1a;学员信息管理系统&#xff08;简易版&#xff09; Python项目18&#xff1a;…