【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

作者推荐

【动态规划】【数学】【C++算法】18赛车

本文涉及知识点

差分数组 图论 分类讨论 整除以2

LeetCode100213按距离统计房屋对数目

给你三个 正整数 n 、x 和 y 。
在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 <= i < n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编号为 x 的房屋与编号为 y 的房屋。
对于每个 k(1 <= k <= n),你需要找出所有满足要求的 房屋对 [house1, house2] ,即从 house1 到 house2 需要经过的 最少 街道数为 k 。
返回一个下标从 1 开始且长度为 n 的数组 result ,其中 result[k] 表示所有满足要求的房屋对的数量,即从一个房屋到另一个房屋需要经过的 最少 街道数为 k 。
注意,x 与 y 可以 相等 。
示例 1:
输入:n = 3, x = 1, y = 3
输出:[6,0,0]
解释:让我们检视每个房屋对

  • 对于房屋对 (1, 2),可以直接从房屋 1 到房屋 2。
  • 对于房屋对 (2, 1),可以直接从房屋 2 到房屋 1。
  • 对于房屋对 (1, 3),可以直接从房屋 1 到房屋 3。
  • 对于房屋对 (3, 1),可以直接从房屋 3 到房屋 1。
  • 对于房屋对 (2, 3),可以直接从房屋 2 到房屋 3。
  • 对于房屋对 (3, 2),可以直接从房屋 3 到房屋 2。
    示例 2:
    输入:n = 5, x = 2, y = 4
    输出:[10,8,2,0,0]
    解释:对于每个距离 k ,满足要求的房屋对如下:
  • 对于 k == 1,满足要求的房屋对有 (1, 2), (2, 1), (2, 3), (3, 2), (2, 4), (4, 2), (3, 4), (4, 3), (4, 5), 以及 (5, 4)。
  • 对于 k == 2,满足要求的房屋对有 (1, 3), (3, 1), (1, 4), (4, 1), (2, 5), (5, 2), (3, 5), 以及 (5, 3)。
  • 对于 k == 3,满足要求的房屋对有 (1, 5),以及 (5, 1) 。
  • 对于 k == 4 和 k == 5,不存在满足要求的房屋对。
    示例 3:
    输入:n = 4, x = 1, y = 1
    输出:[6,4,2,0]
    解释:对于每个距离 k ,满足要求的房屋对如下:
  • 对于 k == 1,满足要求的房屋对有 (1, 2), (2, 1), (2, 3), (3, 2), (3, 4), 以及 (4, 3)。
  • 对于 k == 2,满足要求的房屋对有 (1, 3), (3, 1), (2, 4), 以及 (4, 2)。
  • 对于 k == 3,满足要求的房屋对有 (1, 4), 以及 (4, 1)。
  • 对于 k == 4,不存在满足要求的房屋对。

分类讨论

x,y从1开始,x–,y–让其从0开始。如果x> y,交换x和y。
如果xy,直接处理:{(n-1)*2,(n-2)2…}
题目要计算的是:除了起点和终点外,经过的房屋数。
起点i和终点j相同,不统计。
起点和终点互换,需要统计。可以只统计起点<终点,最后将结果
2。
整个路径可以四个节点i,x,y,j表示。
一,各节点最多出现1次,否则有环,将环删除。
二,i,j 必定出现1次,x和y要么都出现1次,要么不出现。
三,第一个节点必定是i,最后一个节点必定是j。
理论上有六种可能,实际上只有五种:
一,i → \rightarrow j。
二,i → \rightarrow x → \rightarrow y → \rightarrow j。
三,i → \rightarrow y → \rightarrow x → \rightarrow j。这中可能不存在:
{ 到 y 之前已经到达终点 , j < = y y → x → y 这段路程是多走的 j > y \begin{cases} 到y之前已经到达终点, & j <= y \\ y \rightarrow x \rightarrow y这段路程是多走的 & j > y \\ \end{cases} {y之前已经到达终点,yxy这段路程是多走的j<=yj>y
四, x == i,y == i 结果是0。 x → \rightarrow y
五,x
i,y不等于j。 x → \rightarrow y → \rightarrow j
六,x!=i,y等于j。 i → \rightarrow x → \rightarrow y

第一种可能经过的房屋数(不包括起点终点):j-i-1
第二种情况,x==y,无需做特殊处理,会被淘汰。x < y时。
abs(x-i)+ abs(j-y) → \rightarrow abs(x-i)+abx(j-y)
{ i − x + j − y i > x , j > y 一 i − x i > x , j = = y 二 i − x + y − j x > i , j < y 三 x − i + j − y i < x , j > y 四 x − i i < x , j = = y 五 x − i + y − j i < x , j < y 六 j − y i = = x , j > y 七 0 i = = x , j = = y 八 y − j i = = x , j < y 九 \begin{cases} i-x + j- y & i > x ,j>y &一\\ i-x & i > x, j == y &二\\ i-x +y-j & x > i ,j < y &三\\ x-i + j- y & i < x,j > y &四\\ x-i & i < x,j == y & 五\\ x-i+y-j & i < x,j < y& 六\\ j - y & i == x ,j > y &七 \\ 0 & i== x ,j == y & 八\\ y - j & i==x,j < y & 九 \\ \end{cases} ix+jyixix+yjxi+jyxixi+yjjy0yji>x,j>yi>x,j==yx>i,j<yi<x,j>yi<x,j==yi<x,j<yi==x,j>yi==x,j==yi==x,j<y

一,二,七,八 可以合并,合并后 i >=x j >= y 。 四五可以合并,i < x ,j >=y 三九也可以合并。合并i >=x ,j<y
{ i − x + j − y i > = x , j > = y 一 i − x + y − j x > = i , j < y 三 x − i + j − y i < x , j > = y 四 x − i + y − j i < x , j < y 六 \begin{cases} i-x + j- y & i >= x ,j>=y &一\\ i-x +y-j & x >= i ,j < y &三\\ x-i + j- y & i < x, j >= y &四\\ x-i+y-j & i < x,j < y& 六\\ \end{cases} ix+jyix+yjxi+jyxi+yji>=x,j>=yx>=i,j<yi<x,j>=yi<x,j<y

我们枚举i,计算j,故x,y,i可以看做常数,可以求出相等的临界值的j。
情况二一:
i-x + j- y <= j - i -1 → \rightarrow 2i -x - y <= -1 → \rightarrow 2i <= x+y-1 → \rightarrow
{ i → x → y → j 2 ∗ i < = x + y − 1 i → j e l s e \begin{cases} i \rightarrow x \rightarrow y \rightarrow j & 2*i <= x+y-1\\ i \rightarrow j & else \end{cases} {ixyjij2i<=x+y1else
和j无关

情况二三:
i-x +y-j <= j - i -1 → \rightarrow 2*(i-j) -x + y <= -1 → \rightarrow -2j <= x - y - 2i -1注意除以-1,大于会变小于 → \rightarrow 2j >= y-x+2i+1 → \rightarrow j >= (y-x)/2 + i +1
{ i → x → y → j j > = ( y − x ) / 2 + i + 1 i → j e l s e \begin{cases} i \rightarrow x \rightarrow y \rightarrow j & j >= (y-x)/2 + i +1 \\ i \rightarrow j & else \end{cases} {ixyjijj>=(yx)/2+i+1else
情况二四:
要想通过x,y 必须 x-i + j- y <= j - i -1 → \rightarrow x-y <= -1 → \rightarrow x <y,恒成立。

情况二六:
要想通过x,y,必须 x-i+y-j <= j - i -1 → \rightarrow x+y-2j <= -1 → \rightarrow -2j <= -x-y-1 注意除以-1,大于会变小于 → \rightarrow 2j >= x+y+1 → \rightarrow j>=(x+y+1+1)/2
{ i → x → y → j > = ( x + y + 1 + 1 ) / 2 i → j e l s e \begin{cases} i \rightarrow x \rightarrow y \rightarrow & j>=(x+y+1+1)/2 \\ i \rightarrow j & else \end{cases} {ixyijj>=(x+y+1+1)/2else

y >= 0 整除2的逆运算

2x >= y ,如果y是偶数 等效与 x >= y/2 。如果y是奇数,等效与 x >= (y+1)/2 。两者可以统一为: x >=(y+1)/2 。
2
x > y 如果y是偶数 等效与 x > y/2 。如果y是奇数,等效与 x > y/2。两者统一为x > y/2。
2x <= y 可以统一为 x <=y/2。
2
x < y 可以统一为:x < ( y+1)/2

代码

核心代码

class Solution {
public:vector<long long> countOfPairs(int n, int x, int y) {		vector<long long> vRet(n);if (x == y){vRet.clear();for (int i = n - 1; i >= 0; i--){vRet.emplace_back(i * 2);}return vRet;}if (x > y ){swap(x, y);}x--;y--;int i = 0;
#define Path1(j) (j - i -1 )auto Path2 = [&i,&x,&y]( const int j){return abs(i - x) + abs(j - y);};vector<long long> vDiff(n);auto Add = [&](int left, int len){if (len <= 0){return;}vDiff[left] += 2 ;vDiff[left+len] -= 2 ;};for (; i < x; i++){//j 在[y,n)const int iy = max(i + 1, y);if (n - iy > 0){Add(Path2(iy), n - iy);}	//j在(i,y)if( y - i -1 > 0 ){//i->x->y-j [j0,y)const int j0 = (x + y + 2) / 2;	Add(Path2(y-1), y - j0);//(i,j0)Add(0, j0 - i - 1);}}for (; i < n; i++){//j在(max(y-1,i),n)if (2*i <= x + y-1){//i->x->y-jAdd(Path2(max(y-1, i) +1), n - max(y-1, i) -1);}else{Add(Path1(max(y-1, i) +1), n - max(y-1, i) -1);}//j在(i,y)if (y - i - 1 > 0){int j0 = min(y,(2 * i + y - x + 2) / 2);j0 = max(j0, i + 1);//if (y - j0 >= 0){//j在[j0,y) i->x->y-j Add(Path2(y - 1), y - j0);//j在(i,j0)Add(0, j0 - i - 1);}}}long long cur=0;for (int i = 0; i < n; i++){cur += vDiff[i];vRet[i] = cur;}return vRet;}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{	int n,  x,  y;{Solution sln;n = 6, x = 1, y = 5;auto res = sln.countOfPairs(n, x, y);Assert(res, vector<long long>{ 12, 14, 4, 0, 0, 0 });}{Solution sln;n = 3, x = 2, y = 2;auto res = sln.countOfPairs(n, x, y);Assert(res, vector<long long>{4, 2, 0});}{Solution sln;n = 4, x = 1, y = 1;auto res = sln.countOfPairs(n, x, y);Assert(res, vector<long long>{6, 4, 2, 0});}{Solution sln;n = 5, x = 2, y = 4;auto res = sln.countOfPairs(n, x, y);Assert(res, vector<long long>{10, 8, 2, 0, 0});}{Solution sln;n = 3, x = 1, y = 3;		auto res = sln.countOfPairs(n,x,y);Assert(res, vector<long long>{6, 0, 0});}		{Solution sln;n = 2, x = 2, y = 2;auto res = sln.countOfPairs(n, x, y);Assert(res, vector<long long>{2, 0});}}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

Java代码审计Shiro反序列化CB1链source入口sink执行gadget链

目录 0x00 前言 0x01 CC链&CB链简介 1. Commons Collections链是什么&#xff1f; 2. Commons BeanUtils链是什么&#xff1f; 0x02 测试Commons BeanUtils1链 0x03 Shiro550 - Commons BeanUtils1链 - 跟踪分析&#xff08;无依赖&#xff09; 1. 前置知识 2. Co…

Node开发基础

1. 概述 1.1 为什么要学习服务器端开发基础 能够和后端程序员更加紧密的配合 网站业务逻辑前置&#xff0c;学习前端技术需要后端技术支撑 扩宽知识视野&#xff0c;能够站在更高的角度审视整个项目 1.2 服务器端开发要做的事情 实现网站的业务逻辑 ---网站登录部分&#…

矩阵重叠问题判断

创作背景 看到一道题目有感而发想写一篇题解&#xff0c;涉及的是一种逆向思维 桌面窗体重叠 - 洛谷https://www.luogu.com.cn/problem/U399827题目来源于《信息学奥赛课课通》 大致就是给一个长方形的左上顶点坐标&#xff08;x1,y1&#xff09;和右下顶点坐标&#xff08;x…

【设计模式】适配器和桥接器模式有什么区别?

今天我探讨一下适配器模式和桥接模式&#xff0c;这两种模式往往容易被混淆&#xff0c;我们希望通过比较他们的区别和联系&#xff0c;能够让大家有更清晰的认识。 适配器模式&#xff1a;连接不兼容接口 当你有一个类的接口不兼容你的系统&#xff0c;而你又不希望修改这个…

云服务器定价_云服务器价格_云主机计费模式_腾讯云

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第六天-Qt UDP编程(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1-u7GvgM0TLuiy9z7LYQ80Q?pwd1688 提取码&#xff1a;1688 在Qt中提供了QUdpSocket 类来进行UDP数据报&#xff08;datagrams&#xff09;的发送和接收。这里我们还要了解一个名词Socket&#xff0c;也就是常说的“套接字”。 Qt 网络…

强化学习(四)动态规划——1

动态规划算法&#xff08;DP&#xff09;&#xff1a;在马尔可夫决策过程&#xff08;MDP&#xff09;的完美环境模型下计算最优策略。但其在强化学习中实用性有限&#xff0c;其一是它是基于环境模型已知&#xff1b;其二是它的计算成本很大。但它在理论伤仍然很重要&#xff…

2023年12月青少年机器人技术等级考试(五级)理论综合试卷

2023年12月青少年机器人技术等级考试&#xff08;五级&#xff09;理论综合试卷 单选题 第 1 题 单选题 通常状况下&#xff0c;ESP32 WROOM模组的工作电压是&#xff1f;&#xff08; &#xff09; A.3V B.3.3V C.3.6V D.5V 第 2 题 单选题 ESP32 WROOM模组中核&am…

java大数据hadoop2.9.2 Linux安装mariadb和hive

一、安装mariadb 版本centos7 1、检查Linux服务器是否已安装mariadb yum list installed mariadb* 2、如果安装了&#xff0c;想要卸载 yum remove mariadb rm -rf /etc/my.cnf rm -rf /var/lib/mysql 才能完全删除 3、安装mariadb 在线网络安装 yum install -y mari…

网络通信(Socket/TCP/UDP)

一、Socket 1.概念: Socket(又叫套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接协议,客户端的IP地址,客户端的端口,服务器的IP地址,服务器的端口。 一个Socket是一对IP地址…

笔试面试题——二叉树进阶(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、根据二叉树创建字符串1、题目讲解2、思路讲解3、代码实现 二、二叉树的分层遍历1、题目讲…

大数据导论(4)---大数据应用

文章目录 1. 在互联网中的应用1.1 推荐系统1.2 长尾理论1.3 推荐方法与模型1.4 推荐系统应用 2. 在其他领域的应用2.1 企业营销2.2 智慧交通 1. 在互联网中的应用 1.1 推荐系统 1. 推荐系统产生&#xff1a;  (1) 互联网的飞速发展使我们进入了信息过载的时代&#xff0c;搜索…

【赠书第17期】Excel高效办公:文秘与行政办公(AI版)

文章目录 前言 1 了解Excel的强大功能和工具 2 提升Excel技能的方法 3 结合AI技术提升Excel应用 4 注意事项 5 推荐图书 6 粉丝福利 前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们的工作方式也在发生深刻变革。其中&#xff0c;Excel 作…

使用cmake进行完成开发实践

根据这个UML图进行cmake的实践 首先按照使用vscode在wsl2中配置clangd环境-CSDN博客的内容先创建出cmake项目。 之后在项目目录中创建include和src目录。 根据UML图&#xff0c;首先要完成Gun类的实现。分别在include&#xff0c;src目录下创建头文件和源文件&#xff0c;写入…

上位机图像处理和嵌入式模块部署(qt图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多人一想到图像处理&#xff0c;本能的第一反应就是opencv&#xff0c;这也没有错。但是呢&#xff0c;这里面还是有一个问题的&#xff0c;不知…

Leetcode刷题笔记题解(C++):LCR 174. 寻找二叉搜索树中的目标节点

思路&#xff1a;二叉搜索树的中序遍历是有序的从大到小的&#xff0c;故得出中序遍历的结果&#xff0c;即要第cnt大的数为倒数第cnt的数 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeN…

JUC并发编程-集合不安全情况以及Callable线程创建方式

6. 集合不安全 1&#xff09;List 不安全 //java.util.ConcurrentModificationException 并发修改异常&#xff01; public class ListTest {public static void main(String[] args) {List<Object> arrayList new ArrayList<>();for(int i1;i<30;i){new Thr…

​WordPress顶部管理工具栏怎么添加一二级自定义菜单?

默认情况下&#xff0c;WordPress前端和后台页面顶部都有一个“管理工具栏”&#xff0c;左侧一般就是站点名称、评论、新建&#xff0c;右侧就是您好&#xff0c;用户名称和头像。那么我们是否可以在这个管理工具栏中添加一些一二级自定义菜单呢&#xff1f; 其实&#xff0c…

力扣746. 使用最小花费爬楼梯

动态规划 思路&#xff1a; 定义 dp[i] 为到达下标 i 层的最小花费&#xff1b;则状态转移方程为&#xff1a; 第 i 层可以从第 i - 1 层爬一层或者第 i - 2 层爬两层到达&#xff1b;则 dp[i] std::min(dp[i - 1] cost[i - 1], dp[i - 2] cost[i - 2])初始状态&#xff1a…

SpringSecurity+JWT前后端分离架构登录认证

目录 1. 数据库设计 2. 代码设计 登录认证过滤器 认证成功处理器AuthenticationSuccessHandler 认证失败处理器AuthenticationFailureHandler AuthenticationEntryPoint配置 AccessDeniedHandler配置 UserDetailsService配置 Token校验过滤器 登录认证过滤器接口配置…