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

news2024/11/22 17:59:09

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

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

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

相关文章

头条文章采集ChatGPT4.0改写软件环境配置教程步骤

大家好&#xff0c;我是淘小白~ 下面给大家整理一下&#xff0c;ChatGPT4.0改写软件环境配置教程 下面是我们拿到的环境配置软件&#xff0c;分别是&#xff1a;117版本的谷歌浏览器&#xff0c;谷歌浏览器驱动&#xff0c;notepad&#xff08;用于打开config.ini&#xff0c…

计算机网络-物理层基本概念(接口特性 相关概念)

文章目录 总览物理层接口特性星火模型给出的相关概念解释&#xff08;仅供参考&#xff09; 总览 求极限传输速率&#xff1a;奈氏准则&#xff0c;香农定理&#xff08;背景环境不一样&#xff09; 编码&#xff1a;数据变成数字信号 调制&#xff1a;数字信号变成模拟信号 信…

go和swoole性能比较

开发效率 Go语言是本质上是静态语言&#xff0c;开发效率稍差&#xff0c;但性能更强&#xff0c;更适合底层软件的开发 Swoole使用PHP语言&#xff0c;动态脚本语言&#xff0c;开发效率最佳&#xff0c;更适合应用软件的开发 IO模型 go语言使用单线程eventloop处理IO事件&…

机器学习-numpy

机器学习–numpy Numpy&#xff08;Numerical Python&#xff09;是一个开源的Python科学计算库&#xff0c;用于快速处理任意维度的数组。 Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务&#xff0c;使用Numpy比直接使用Python要简洁的多。 Numpy使用ndarray对象来…

提取文案小助手小程序使用方法?

​很多人经常会说文案提取小程序&#xff0c;今天就来说说提取文案小助手如何将视频转化为文本的&#xff01;如何免费提取视频文案&#xff1a; 视频转换文字使用步骤 步骤一 复制你想提取的短视频链接; 步骤二 打开微信客户端搜索 : 文案提取小程序&#xff0c;或者保存下…

【办公类-22-01】20240123 UIBOT逐一提取CSDN质量分

背景需求&#xff1a; 最近每天传2份Python&#xff0c;发现平均分从73.5降到了72.7。网上搜索一下原因&#xff0c;发现每篇CSDN都有一个评分&#xff08;以下是查分网站&#xff09; https://www.csdn.net/qchttps://www.csdn.net/qc 但是一篇一篇查询&#xff0c;显然太繁…

多线程-线程的等待通知wait、notify

目录 1.什么是线程的等待通知 2.wiat&#xff08;&#xff09;方法 2.1 wait 做的事情: 2.2wait 结束等待的条件: 代码示例&#xff1a; 2.3wait的三种重载方式 2.4 面试问题&#xff1a;wait&#xff08;&#xff09;和sleep&#xff08;&#xff09;之间的区别 3.notify…

CHS_03.2.2.3_1+2.2.5+进程调度的时机、切换与过程、方式

CHS_03.2.2.3_12.2.5进程调度的时机、切换与过程、方式 知识总览进程调度的时机进程调度的方式进程的切换与过程 知识回顾 在这个小节中 我们会继续学习进程调度相关的一系列知识点 知识总览 首先 我们会来回答下 进程调度的时机是什么 什么时候需要进行进程调度 而什么时候又…

docker 搭建mysql集群一主一从,两台机器

一、准备两条机器&#xff0c;分别为IP1和IP2&#xff0c;其中IP1为主,IP2为从 二、在两台机器上分别拉取mysql镜像 docker pull mysql:8.0.29三、在home目录下新建目录&#xff0c;分别为/home/mysql/data,/home/mysql/conf 1、在IP1主机下的/home/mysql/conf目录下新建my.cn…

日期处理第四篇(终)- Java日期时间处理大总结

文章目录 日期时间概念通用标准日期字段解析国际化的日期格式 日期的实战第一个问题&#xff1a;日期常用时间操作第二个问题&#xff1a;时区的问题时区概念时区的处理ZoneID的使用 ZoneOffset的使用让人恼火的夏令时 第三个问题&#xff1a;MySQL存储时间用什么类型&#xff…

12. openCV在QT环境中利用zBar开发库实现二维码内容识别

1. 说明 本篇博客仅记录如何使用zBar库进行二维码内容的识别,其中牵扯到的一些其它知识点,比如二维码区域检测、zBar库开发环境配置等可以参考本专栏的其它相关博客,此篇博客不再赘述。 2. 具体步骤 博客中代码功能:手动选择一张包含二维码的图片,会将检测到的二维码区…

Linux 的提示符太长了,帮你精简一下

普通用户修改文件 ~/.bashrc 修改 50 行左右的代码&#xff0c;将两个w改为大写的W 如果是root用户则修改文件/root/.bashrc&#xff0c;同样的方法。

Lingo数学建模基础

1.基本运算符 1.1算数运算符 1.2逻辑运算 #not# 否定操作数的逻辑值&#xff0c;一元运算符 #eq# 若两运算数相等&#xff0c;则为true,否则为false #ne# 若两运算数不相等&#xff0c;则为true,否则为false #gt# 若左边运算数严格大于右边&#xff0c;则为true,否则为…

智能小程序环境配置流程

App 与智能小程序 在用户使用 App 扫描小程序的二维码或者点击设备&#xff0c;尝试进入小程序时&#xff0c;系统会对 App 当前环境与小程序所需运行环境进行比对&#xff0c;确定环境配置兼容后&#xff0c;App 才能启动并运行小程序。 比对规则中&#xff0c;主要涉及&…

NVMe TCG安全数据存储简介

NVMe&#xff08;非易失性内存主机控制器接口规范&#xff09;与TCG&#xff08;可信计算组&#xff09;的集成主要体现在数据安全、固件验证和硬件信任根等方面&#xff0c;以确保存储设备的数据保护能力和安全性。 TCG Opal定义了一套针对自加密硬盘&#xff08;SED, Self-En…

Linux部署MinIO实现图片存储,读取,删除

1、MinIo简介 MinIO 是一个高性能的分布式对象存储服务&#xff0c;它与亚马逊的S3&#xff08;简单存储服务&#xff09;兼容&#xff0c;在开源许可下是免费和开放的。您可以用它存储任何种类的对象&#xff0c;也就是说可以存储无结构的数据如照片、视频、日志文件、备份和…

解决github无法访问的问题(修改hosts)

1.先ping github.com看是否能ping通 不能ping通的话&#xff0c;找到github最新的ip地址&#xff0c;修改hosts文件&#xff08;C:\Windows\System32\drivers\etc&#xff09; 找最新的ip地址的办法&#xff1a; a.cmd中ping时返回的 b.点击ipaddress.com查询网站链接 修改host…

c盘红色满了怎么清理c盘空间?整理了5个方法~

用户文档、下载文件、图片和视频等个人文件的不断增长导致了磁盘空间紧张。那么如何管理文件&#xff0c;清理我们的电脑呢&#xff1f;下面整理了5个不同类型的方法。 方法一&#xff1a;清理临时文件 1、打开“运行”&#xff08;Win R&#xff09;&#xff0c;输入 %temp…

最新阿里云免费SSL证书申请使用介绍

为网站部署SSL证书已经是现在站长的必须要做的工作&#xff0c;然而SSL证书并不全是免费的&#xff0c;免费且好用的资源也越来越有限&#xff0c;毕竟嘛&#xff0c;这些都需要成本。 PS&#xff1a;最下方有最终建议方案。 本文介绍当前(2024年)阿里云免费SSL证书信息。 阿…

企业为什么需要WMS仓储管理系统,终于有人说明白了

随着科技的飞速发展和市场竞争的加剧&#xff0c;仓储企业面临着越来越多的挑战和机遇。为了提高产品的性能和质量&#xff0c;同时节约成本、提高运营效率&#xff0c;数字化建设成为了仓储企业的核心需求。而WMS仓储管理系统的应用&#xff0c;更是企业数字化建设的重中之重。…