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 long
    vector<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>=y
                    add(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-1
                    add(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+1
                    int j = (x + y + 1) / 2 + 1;
                    //j到y-1
                    add(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)/2
                    int 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;
    }
};

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

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

相关文章

Linux中普通用户如何使用sudo指令提升权限

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 普通用户为何无法使用sudo&#xff1f; 我们来看一下具体操作 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升起的太阳&#xff0c;一种是正在努力…

Facebook的区块链之路:探秘数字货币的未来

近年来&#xff0c;Facebook一直在积极探索区块链技术&#xff0c;并逐渐将目光聚焦在数字货币领域。从推出Libra项目到改名为Diem&#xff0c;Facebook一直在寻求在数字货币领域取得突破性进展。本文将深入探讨Facebook的区块链之路&#xff0c;揭示其对数字货币未来发展的影响…

LLM自回归解码

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;大型语言模型&#xff08;LLM&#xff09;如Transformer进行推理时&#xff0c;自回归解码是一种生成文本的方式。在自回归解码中&#xff0c;模型在生成下一个单词时会依赖于它之前生成的单词。 使用自回归解码的公式…

数字拆分--完全背包问题

一、题目 https://acm.ecnu.edu.cn/problem/3034/ 二、思路 本来算法就很弱&#xff0c;加上很久没刷题&#xff0c;做这道题真的是一言难尽~ 一开始我以为是找规律写递推式&#xff0c;写到f(9)的时候就觉得不对劲&#xff0c;又想了一会&#xff0c;还是没想到&#xff0…

【linux】Linux编译器-gcc/g++使用

先写一段代码演示 1 #include<stdio.h>2 #define M 1003 int main()4 {5 printf("hello linux");6 printf("hello linux");7 //printf("hello linux");8 //printf("hello linux");9 //printf("hello linux");10 //pri…

Win10 如何用powershell写个WOL开机脚本

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 如何用powershell写个WOL开机脚本 解决方案&#xff1a; 1.脚本内容 $mac b1-10-18-52-11-12 $macBytes $mac -split - | ForEach-Object { [byte](0x $_) } $broadcastAddress [byte[]](1..6 | ForEach-O…

【江科大】STM32:中断系统(理论)

文章目录 中断系统为什么要使用中断中断优先级中断嵌套STM32的中断系统如何管理这些中断NVIC的结构![请添加图片描述](https://img-blog.csdnimg.cn/c77b038fd63a4ddfbcd3b86f6dfe596b.png) 优先级窗口看门狗&#xff08;WWDG&#xff09;&#xff1a;外部中断模块的特性&#…

unity刷新grid,列表

获取UIGrid 组件&#xff0c;更新列表 listParent.GetComponent().repositionNow true;

【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 设置时钟频率2.4 生成代码2.5 编译并下载代码2.6 结果2.7 问题 三、回环测试3.1 打开工程3.2 添加回环代码3.3 编译烧录并测试 四、出现问题和解决方法4.1 烧录总是要自己插拔USB4.2 自己生成的工程没…

Python基础之数据库操作

一、安装第三方库PyMySQL 1、在PyCharm中通过 【File】-【setting】-【Python Interpreter】搜索 PyMySQL进行安装 2、通过PyCharm中的 Terminal 命令行 输入: pip install PyMySQL 注&#xff1a;通过pip安装&#xff0c;可能会提示需要更新pip&#xff0c;这时可执行&#…

could‘t get post build model module: xx.app.main variant:xxdebbug

当androidStudio进行run应用的时候,报错&#xff1a; couldt get post build model module: xx.app.main variant:xxdebbug后经过排查&#xff0c;方案如下&#xff1a; invalidate caches 清除缓存&#xff08;全部勾选&#xff09;&#xff1b; 删除 .gradle 目录&#xff…

【JS逆向学习】某壁纸下载(ast混淆)

逆向目标 目标网址&#xff1a;https://bz.zzzmh.cn/index逆向接口一&#xff1a;https://api.zzzmh.cn/bz/v3/getData逆向接口二&#xff1a;https://cdn2.zzzmh.cn/wallpaper/origin/0d7d8d691e644989b72ddda5f695aca2.jpg?response-content-dispositionattachment&aut…

eNSP学习——理解ARP及Proxy ARP

目录 名词解释 实验内容 实验目的 实验步骤 实验拓扑 配置过程 基础配置 配置静态ARP 名词解释 ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议。ARP表项可以分为动态和静态两种类型。   动态ARP是利用ARP广播报文&#xff0c;动态执行并自动进…

RT-DETR 模型改进 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

TensorRT英伟达官方示例解析(二)

系列文章目录 TensorRT英伟达官方示例解析&#xff08;一&#xff09; TensorRT英伟达官方示例解析&#xff08;二&#xff09; 文章目录 系列文章目录前言一、03-BuildEngineByTensorRTAPI1.1 建立 Logger&#xff08;日志记录器&#xff09;1.2 Builder 引擎构建器1.3 Netwo…

关于 LLM,你了解多少?

LLM定义 大语言模型&#xff08;LLM&#xff09;是一种基于大量文本数据训练的深度学习模型。它的主要功能是生成自然语言文本或理解语言文本的含义。这些模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、对话等&#xff0c;是通向人工智能的一条重要途径。 LLM发…

什么是通配监听端口? 什么是通配监听IP?

什么是通配监听端口? 监听端口&#xff1a; 指的是服务器或服务开启的特定TCP或UDP端口号&#xff0c;等待客户端连接或发送数据。TCP/IP协议下每个端口只能由一个服务独占监听&#xff0c;一个服务或应用会指定监听特定的一个或多个端口来接收客户端的连接请求。 例如 Web…

计算机网络基础概念解释

​ 1. 什么是网络 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;于是有了网络互连。 网络互连&#xff1a;将多台计算机连接在⼀起&#xff0c;完成数据共享。 数据共享本质是…

JRT集中打印

之前一直在夯实基础&#xff0c;现在是补demo的时段了。了解过检验集中打印的人知道&#xff0c;集中打印的逻辑有多复杂。既要考虑普通检验报告加上换页。又要考虑微生物报告加上换页&#xff0c;既有A5的报告&#xff0c;也有A4的报告&#xff0c;还要考虑A4打印两个组装A5时…

小程序学习-21

目前小程序分包大小有以下限制&#xff1a; 整个小程序所有分包大小不超过 20M单个分包/主包大小不能超过 2M 独立分包&#xff1a;"independent": true