力扣——835. 图像重叠(Java、JavaScript、C实现)
JAVAJavaScript 实现 图像 力扣 重叠
2023-09-14 09:05:31 时间
- 图像重叠
给你两个图像 img1 和 img2 ,两个图像的大小都是 n x n ,用大小相同的二进制正方形矩阵表示。二进制矩阵仅由若干 0 和若干 1 组成。
转换 其中一个图像,将所有的 1 向左,右,上,或下滑动任何数量的单位;然后把它放在另一个图像的上面。该转换的 重叠 是指两个图像 都 具有 1 的位置的数目。
请注意,转换 不包括 向任何方向旋转。越过矩阵边界的 1 都将被清除。
最大可能的重叠数量是多少?
示例 1:
输入:img1 = [[1,1,0],[0,1,0],[0,1,0]], img2 = [[0,0,0],[0,1,1],[0,0,1]]
输出:3
解释:将 img1 向右移动 1 个单位,再向下移动 1 个单位。
两个图像都具有 1 的位置的数目是 3(用红色标识)。
示例 2:
输入:img1 = [[1]], img2 = [[1]]
输出:1
示例 3:
输入:img1 = [[0]], img2 = [[0]]
输出:0
Java代码:
class Solution {
public int largestOverlap(int[][] A, int[][] B) {
int n = A.length;
int[][] count = new int[n * 2 - 1][n * 2 - 1];
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++)
if (A[i][j] == 1)
for (int x = 0; x < n; x ++)
for (int y = 0; y < n; y ++)
if (B[x][y] == 1)
count[i - x + n - 1][j - y + n - 1] ++;
int res = 0;
for (int i = 0; i < n * 2 - 1; i ++)
for (int j = 0; j < n * 2 - 1; j ++)
res = Math.max(res, count[i][j]);
return res;
}
}
C代码:
#define DEBUG 0
#if DEBUG
#define dbg(fmt, ...) do { printf("[%s-%d]"fmt"\r\n", __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0)
#else
#define dbg(fmt, ...) do {} while (0)
#endif
int g_largestOverlap = 0;
int CalcOverlap(int** A, int ASize, int* AColSize, int** B, int BSize, int* BColSize, int x, int y)
{
int i, j;
int overlap = 0;
for (i = 0; i < ASize; i++) {
for (j = 0; j < AColSize[i]; j++) {
if ((((i + y) >= 0) && ((i + y) < ASize)) && (((j + x) >= 0) && ((j + x) < ASize))) {
dbg("i + x:%d, i + y:%d", i + x, i + y);
overlap += (B[i][j] & A[i + y][j + x]);
}
}
}
return overlap;
}
void dfs(int** A, int ASize, int* AColSize, int** B, int BSize, int* BColSize, int **visited, int x, int y)
{
int overlap;
int d[][2] = {
{ 0, 1},
{ 0, -1},
{-1, 0},
{ 1, 0}
};
int i;
int xx, yy;
overlap = CalcOverlap(A, ASize, AColSize, B, BSize, BColSize, x, y);
dbg("x:%d, y:%d, overlap:%d", x, y, overlap);
if (g_largestOverlap < overlap) {
g_largestOverlap = overlap;
dbg("g_largestOverlap:%d", g_largestOverlap);
}
for (i = 0; i < 4; i++) {
xx = x + d[i][0];
yy = y + d[i][1];
if (((xx + ASize) >= 2 * ASize) || ((xx + ASize) <= 0) ||
((yy + ASize) >= 2 * ASize) || ((yy + ASize) <= 0)) {
//dbg("xx:%d, yy:%d 2 * ASize:%d", xx, yy, 2 * ASize);
continue;
}
//dbg("xx + ASize:%d, yy + ASize:%d", xx + ASize, yy + ASize);
if (visited[yy + ASize][xx + ASize]) {
continue;
}
visited[yy + ASize][xx + ASize] = 1;
dfs(A, ASize, AColSize, B, BSize, BColSize, visited, xx, yy);
//visited[xx + ASize][yy + ASize] = 0;
}
return;
}
int largestOverlap(int** A, int ASize, int* AColSize, int** B, int BSize, int* BColSize)
{
int i;
int **visited;
g_largestOverlap = 0;
visited = malloc(ASize * 2 * sizeof(int *));
for (i = 0; i < ASize * 2; i++) {
visited[i] = malloc(ASize * 2 * sizeof(int));
memset(visited[i], 0, ASize * 2 * sizeof(int));
}
dfs(A, ASize, AColSize, B, BSize, BColSize, visited, 0, 0);
return g_largestOverlap;
}
JavaScript代码:
/**
* @param {number[][]} img1
* @param {number[][]} img2
* @return {number}
*/
var largestOverlap = function (img1, img2) {
const len = img1.length
const count = Array(2 * len + 1)
.fill(0)
.map(() => Array(2 * len + 1).fill(0))
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) {
if (img1[i][j] === 1) {
for (let i2 = 0; i2 < len; i2++) {
for (let j2 = 0; j2 < len; j2++) {
if (img2[i2][j2] === 1) {
count[i - i2 + len][j - j2 + len] += 1
}
}
}
}
}
}
let ans = 0
for (const row of count) {
ans = Math.max(...row, ans)
}
return ans
}
作者:KJ.JK
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
相关文章
- java 音频转为wav格式标准音频 | Java工具类
- java xml解析框架_JAVA解析xml的五种方式对比
- java工作流_Java 实现简单工作流
- md5 java 实现_MD5加密的Java实现
- java运行机制是什么_JAVA运行机制
- java用正则表达式大全_Java 正则表达式 大全「建议收藏」
- java redis锁_Java中Redis锁的实现[通俗易懂]
- java oracle数据备份_Java实现Oracle数据库备份
- JavaScript 模仿Java的Map集合,实现功能详解编程语言
- java实现javascript中的escape和unescape函数详解编程语言
- 实现Java程序操作MySQL数据库(java调用mysql)
- 如何使用Java连接MySQL数据库(java怎么连接mysql数据库)
- Linux平台上Java新版本发布(linux发布java)
- Java异步MySQL:开启数据处理新时代(java异步mysql)
- MySQL驱动程序:Java集成简易操作(mysql的java驱动)
- Java轻松使用Redis实现数据高效存储(java使用redis)
- 实战探索:Java中使用Redis缓存(java的redis案例)
- Java与Oracle的连接方式(java连oracle)
- Java编程实现MySQL表备份(java备份mysql表)
- 实现Java实现的Redis封装类:强化Redis技术支持(redis封装类java)
- Java调用Linux库实现跨系统功能(java调用linux库)
- 程序Oracle调用Java程序的实现方法(oracle调用java)
- 期Java开发高效配置MySQL长期支撑(mysql java 长)
- Java应用在Linux上乱码的原因及解决方法(java linux乱码)
- Java连接Oracle实现简单快捷的数据传输(java联结oracle)
- Java存入Oracle数据库实现快速高效的数据存储(java存入oracle)
- 数据库Java编程修改Oracle数据库的实践(java修改oracle)
- 编程Oracle数据库中实现Java编程的突破之道(oracle使用java)
- 使用Java实现Redis锁定的实现(redis锁定 java)
- 前台js对象在后台转化java对象的问题探讨
- Java基础之java处理ip的工具类