我有一个int[][]
数组,如下所示:
int[][] arr = { {3, 4, 3, 5, -9},
{0, 4, 4, -8, 6},
{1, 1, 3, -9, 6},
{4, 3, -2, 5, 6}};
实际的问题是在2维数组中找到一个矩形,该矩形的每个角与2维数组中的角元素具有相同的值。例如,角分别是3,-9、4和6。结果矩形是[0,2],[0,4],[1、2],[1,4]处的矩形。
我的尝试是首先找出每行上所有[3,-9]的位置,例如,第一行在[{0,0},{0,4}处有两个]和[{0,2},{0,4}]。
我可以做标准嵌套for
循环到找到每个3,并且每个9:
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
// if value is 3, store the co-ordinates
// if value is 9, store the co-ordinates (separately)
}
}
但是随后我被迫遍历2个列表(分别是3s和-9s),并检查每3个列表是否在同一行中有一个-9,并且在该行之后是-9,如果是这样,将两个坐标合并并存储在一起。
然后当然我已经做的4S和6S相同,它已迅速成为一个大的烂摊子。
也许我看错了一切,可以将其视为XY Problem。
我的问题:如何在2d数组中找到一个矩形,且该矩形的角与2d数组的外角相匹配?
答案 0 :(得分:1)
普通搜索怎么样?
public static List<Point> findRectangle(int[][] arr) {
int height = arr.length;
int width = arr[0].length;
for (int rowTop = 0; rowTop < height - 1; rowTop++) {
for (int colLeft = rowTop == 0 ? 1 : 0; colLeft < width - 1; colLeft++) {
// find new left-top corner
if (arr[rowTop][colLeft] != arr[0][0])
continue;
int colRight = colLeft + 1;
while (colRight < width && arr[rowTop][colRight] != arr[0][width - 1]) {
colRight++;
}
if (colRight == width)
continue;
// find new left-bottom corner
int rowBottom = rowTop + 1;
while (rowBottom < height && arr[rowBottom][colLeft] != arr[height - 1][0]) {
rowBottom++;
}
if (rowBottom == height || arr[rowBottom][colRight] != arr[height - 1][width - 1])
continue;
return Arrays.asList(
new Point(rowTop, colLeft),
new Point(rowTop, colRight),
new Point(rowBottom, colLeft),
new Point(rowBottom, colRight));
}
}
return Collections.emptyList();
}
public static final class Point {
private final int row;
private final int col;
public Point(int row, int col) {
this.row = row;
this.col = col;
}
}