leetcode第 381 场周赛最后一题 差分,对称的处理

2024-01-23 08:12

本文主要是介绍leetcode第 381 场周赛最后一题 差分,对称的处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第 381 场周赛 - 力扣(LeetCode)最后一题3017. 按距离统计房屋对数目 II - 力扣(LeetCode)

dijkstra超时了,看了灵神的解题方法力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台,其实是差分优化的暴力统计

灵神说的“撤销操作”,就是先不加那条xy新路,统计出所有距离对数,然后再加上那条路做修改。做修改需要推一下变短的位置。

灵神封装写的特别好,这道题不封装一下,有问题改起来很麻烦。

目录

统计原始距离对数:

找规律:

灵神暴力左右:

差分:

做修改:

第一种:

第二种:

关于小于区间右端点(x+y)/2:(等于过不了)

当 x==y 及x == y+1时没有缩短任何距离。不需要操作

参考代码:


统计原始距离对数:

这里说两种方法,第一种是自己想的找规律(其实踩坑了,没弄好差分),第二种就是灵神暴力,时间复杂度是相同的O(n)

找规律:

分别对奇数和偶数找一下:

第一行1 2 3 4 5五个数是题目里的房屋,左边第一列是距离 t,表中的则是与这个房屋距离为t的房屋数。

我们暴力完成这个表。

比如第一行,对1来说距离为1的只有2一个,所以是1;对2来说距离为1的是1和3,即两个。

会发现每一行会比前一行少2,而第一行也是“1 2 2 .. 2 2 1”可以列式算出来,所以可以距离为1到n的房屋对数数组(我们要返回的数组)给初始化。

        //      1 2 3 4 5//1:    1 2 2 2 1   //2就算最多啦//2:    1 1 2 1 1   //-2//3:    1 1 0 1 1   //-2//4:    1 0 0 0 1   //-2//5:    0 0 0 0 0   //-2 这个要减成0//      1 2 3 4 5 6//1:    1 2 2 2 2 1//2:    1 1 2 2 1 1     //-2//3:    1 1 1 1 1 1     //-2//4:    1 1 0 0 1 1     //-2//5:    1 0 0 0 0 1     //-2//6:    0 0 0 0 0 0     //-2

注意:

房屋数为n的情况下,不存在距离为n的房屋对(最大也是1和n之间差n-1),所以返回数组最后一位必定是0.

灵神暴力左右:

对于房屋 i ,距离为1的就是 i-1 和 i+1 ,距离为2的就是 i-2 和 i+2 ,......

一直到两边,可得左侧距离最大为i-1,右侧为n-i,

所以距离为 1 ~ i -1  的都要加一对,距离为 1 ~ n - i 的也都要加一对

差分:

而我们正好用的是差分数组。差分就是第一位为初始值,后面的都表示和前一位相差的值。对这种连续的情况,用差分是秒算的。

做修改:

首先看情况,其实就四种会变短,而这四种是对称的,也就是说其实就两种情况。

我们 i 为始点,j为终点,(x,y)为新增的路,我们让x<y。

第一种:

i 在 x左边    i <= x 

只有当 j 在y左右的时候才会缩短距离:

j在y左的位置的计算:就是算什么时候走新路更短

 

偶数的话会有一个点,这个点不走(大于号嘛,不取)

奇数的话本是两点之间,正好向下取整了,如下图的a,中间是正好,所以b可取

第二种:

x < i < (x+y)/2      剩下的区间就是对称的

第二种的y左这个j的计算

关于小于区间右端点(x+y)/2:(等于过不了)

这个短点也没有缩短的:

奇数情况        x -  - i - - y       很明显i到x和y一样远

偶数情况        x - i - - y          i直接到y为3,i到x再到y为2+1 == 3

所以<(x+y)/2

——————

当 x==y 及x == y+1时没有缩短任何距离。不需要操作

参考代码:

灵神那个写的好,我没封装。不过对称的处理可以看看,处理是类似的。

他用函数会还原,我是用个if 还原的,然而if条件有关于对称用的值的,所以后面可能进不去,还原失败。

class Solution {
#define ll long longvector<ll>ans;void add(int l, int r, int v){if(l>r)return;ans[l] += v;ans[r + 1] -= v;}
public:vector<long long> countOfPairs(int n, int x, int y){if (x>y)swap(x, y);ans = vector<ll>(n + 2);// ans[1] = n + n - 2;// for (int i = 2; i <= n - 1; i++)// {//     ans[i] = -2;// }//for (int k = 1; k <= n; k++){int i = k,orx = x,ory = y;add(1, i - 1, 1);add(1, n - i, 1);if (y - x < 2)continue;if (k > (orx + ory + 1) / 2){i = n + 1 - k;x = n + 1 - ory;y = n + 1 - orx;}if (i <= x){//1.j>=yadd(y - i, n - i,-1);//add(x-i+1,x-i+1+n-y, 1);没有想用“缩短的距离”int dec = y - x - 1;//比如 2 3 连完还是1,缩短了0,3-2-1add(y - i - dec, n - i - dec, 1);//2.x<j<y       i    x     j y//只管能短的,即:j-i > x-i + 1 + y-j//              2j > x+y+1//               j > (x+y+1)/2//j==(x+y+1)/2+1int j = (x + y + 1) / 2 + 1;//j到y-1add(j-i,y-i-1,-1);add(x - i + 2, x-i + 1 + y-j, 1);//3.j<=x不用管}else if (i < (x + y) / 2)// x - i - y 与 x - i - - y 都是不起作用,不需等于{                        //等于的话//y右:add(y-i,n-i,-1);int dec = y - i - (i - x + 1);add(y - i-dec, n - i-dec, 1);//y左://j-i>i-x+1+y-j//2j>2i-x+1+y//j>(2i-x+1+y)/2int j = i + (- x + 1+ y) / 2 + 1;add(j-i,y-1-i,-1);add(i - x +2, i - x + y - j + 1,1);}if (k > (orx + ory + 1) / 2){x = orx;y = ory;}}vector<ll>ret(n);ll sum_d = 0;for (int i = 0; i < n; i++){sum_d += ans[i+1];ret[i] = sum_d;}return ret;}
};

这篇关于leetcode第 381 场周赛最后一题 差分,对称的处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635772

相关文章

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

浅析Python中如何处理Socket超时

《浅析Python中如何处理Socket超时》在网络编程中,Socket是实现网络通信的基础,本文将深入探讨Python中如何处理Socket超时,并提供完整的代码示例和最佳实践,希望对大家有所帮助... 目录开篇引言核心要点逐一深入讲解每个要点1. 设置Socket超时2. 处理超时异常3. 使用sele

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock