二维差分

news/2024/12/22 14:34:42/文章来源:https://www.cnblogs.com/yaoguyuan/p/18622115

[Algo] 二维前缀和&二维差分

1. 最大的以1为边界的正方形

// 1. 最大的以1为边界的正方形
// https://leetcode.cn/problems/largest-1-bordered-square/description/
int get(vector<vector<int>> &v, int i, int j)
{return (i < 0 || j < 0) ? 0 : v[i][j];
}
void build(vector<vector<int>> &v)
{int n = v.size(), m = v[0].size();for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){v[i][j] += get(v, i, j - 1) + get(v, i - 1, j) - get(v, i - 1, j - 1);}
}
int sum(vector<vector<int>> &v, int a, int b, int c, int d)
{// 返回(a, b) - (c, d)围成的矩形中所有元素的和if (a > c) return 0; // 特别判断边长为2的情况return get(v, c, d) - get(v, c, b - 1) - get(v, a - 1, d) + get(v, a - 1, b - 1);
}
int largest1BorderedSquare(vector<vector<int>>& v) {// 枚举每个正方形-O(n*m*min(n,m)), 利用二维前缀和判断包括外边界的和减去内部和是否等于周长int n = v.size(), m = v[0].size();build(v);if (sum(v, 0, 0, n - 1, m - 1) == 0) return 0;int ans = 1;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){for (int k = ans + 1, c = i + ans, d = j + ans; c < n && d < m; k++, c++, d++)if (sum(v, i, j, c, d) - sum(v, i + 1, j + 1, c - 1, d - 1) == 4 * (k - 1)) ans = k;}return ans * ans;
}

2. 用邮票贴满网格图

// 2. 用邮票贴满网格图
// https://leetcode.cn/problems/stamping-the-grid/
int get(vector<vector<int>> &v, int i, int j)
{int n = v.size(), m = v[0].size();return (i < 0 || i >= n || j < 0 || j >= m) ? 0 : v[i][j];
}
void build(vector<vector<int>> &v)
{// 生成二维前缀和数组int n = v.size(), m = v[0].size();for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){v[i][j] += get(v, i, j - 1) + get(v, i - 1, j) - get(v, i - 1, j - 1);}
}
int sum(vector<vector<int>> &v, int a, int b, int c, int d)
{// 返回(a, b) - (c, d)围成的矩形中所有元素的和return get(v, c, d) - get(v, c, b - 1) - get(v, a - 1, d) + get(v, a - 1, b - 1);
}
void add(vector<vector<int>> &v, int a, int b, int c, int d)
{// 二维差分int n = v.size(), m = v[0].size();v[a][b] += 1;if (c + 1 < n && d + 1 < m) v[c + 1][d + 1] += 1;if (d + 1 < m) v[a][d + 1] -= 1;if (c + 1 < n) v[c + 1][b] -= 1;
}bool possibleToStamp(vector<vector<int>>& v, int h, int w) {int n = v.size(), m = v[0].size();vector<vector<int>> prefix_sum = v;vector<vector<int>> diff(n, vector<int>(m, 0)); // 初始化为全零数组build(prefix_sum);for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){if (v[i][j] == 0 && i + h - 1 < n && j + w - 1 < m && sum(prefix_sum, i, j, i + h - 1, j + w - 1) == 0)add(diff, i, j, i + h - 1, j + w - 1);}build(diff);for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){if (v[i][j] == 0 && diff[i][j] == 0) return false; // 检查所有空白区域}return true;
}

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

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

相关文章

第十章

例10.1点击查看代码 import numpy as np import statsmodels.api as sm import pylab as pltdef check(d):x0 = d[0]; y0 = d[1]; d = {x:x0, y:y0}re = sm.formula.ols(y~x, d).fit()print(re.summary())print(re.outlier_test())print(残差的方差, re.mse_resid)pre=re.get_…

Javascript元编程

元编程 (Metaprogramming) 是编写操作程序本身的程序的艺术,允许程序通过操作代码结构和行为来自我调整。元编程的核心是增强代码灵活性和动态性,典型的元编程功能包括拦截、修改、生成代码等 文章首发博客,点击查看 扫码关注公众号,查看更多优质文章引文:引用维基百科元编…

23粘性定位-z index-浮动-浮动练习

一、粘性定位 - sticky 另外还有一个定位的值是position:sticky,比起其他定位值更新一些。 sticky是一个大家期待已久的属性; 可以看作是相对定位和固定(绝对)定位的结合体; 它允许被定位的元素表现得像相对定位一样,直到它滚动到某个阈值点; 当达到这个阈值点时,就会变…

iPhone越狱版和免越狱版iMessages群发,iMessages短信,imessages推信群发实现原理

Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用。完美替代运营商的短信与电话。并且FaceTime与iMessage的帐号不仅仅与Apple ID 绑定,同时也与使用这Apple ID的手机号码绑定,这样的漏洞自然给无孔不入的群发垃圾信息商们提供了后门。这样iPhone的…

IDEA Spring MVC配置.

参考1 https://blog.csdn.net/qq_74329022/article/details/138326488 示例 省赛 easyspring 配置。

专业数据恢复软件iFindDataRecoveryv9.2.3 绿色便携版

睿共享*关注我 前言 iFinD Data Recovery一款特别实用的数据找回工具,它很厉害,能帮你在SSD硬盘和Windows10系统上找回丢失的数据。而且,它还能深度扫描并恢复各种主流数码相机里的RAW格式照片,速度超快,用起来也很稳定顺畅,就算是新手也能轻松上手使用。 安装环境 [名称…

【Rive】Android与Rive交互

1 Android与Rive交互的常用接口 1.1 RiveAnimationView参数 <app.rive.runtime.kotlin.RiveAnimationViewandroid:id="@+id/rive_view"android:layout_width="match_parent"android:layout_height="match_parent"android:adjustViewBounds=&q…

【Rive】混合动画

1 混合动画简介 ​ 【Rive】动画 中介绍了 Rive 中动画的基础概念和一般动画的制作流程,本文将介绍混合动画的基础概念和一般制作流程。Unity 中混合动画介绍详见→ 【Unity3D】动画混合。 ​ 混合动画是指同一时刻多个动画按照一定比例同时执行,这些动画控制的动画参数…

Command-line Environment

Command-line Environment 任务控制 shell会使用UNIX提供的信号机制去执行进程间的通信,进程收到信号的时候,会基于信号改变其执行 停止 停止任务:^c 信号:SIGINT在进行find遍历目录时,使用^c,发出SIGINT到该进程,停止了该任务 课程中提供了一个脚本,忽略了SIGINT信号的…

【嵌入式开发】探讨下PC端的BLE开发

目前在嵌入式设备端,实现了不少ble的功能。比如音频传输,图片传输。一般要方便演示,需要开发个对应的手机app。但是我又是很偷懒的人。想着,python这个工具这么强大,在PC端可以用python几行代码就实现掉吧? 说干就干! 根据同事的推荐,用了python的bleak蓝牙库。 我是在…

Jmeter 修改Sampler result 结果信息

首先说一下,jmeter的Sampler result是什么? Jmeter 的Samplers result 是jmeter在向服务器发送请求后,接收到服务器响应的基本信息的展示,如 sample 的开始请求时间、发送的内容大小、基于协议的响应状态码和响应消息等信息。 什么是基于协议的响应状态码和响应消息。比如h…