java - Java - 在二维数组中查找连续元素
问题描述
我在使用算法时遇到问题,假设如下:电影院有 n 排,每排有 m 个座位(n 和 m 不超过 20)。一个二维矩阵存储了售票信息,数字 1 表示该地点的票已售出,数字 0 表示该地点可用。你想买k张到同一排相邻座位的票。看看能不能做。
输入数据
在输入上,程序获得 n 行和 m 个座位的数量。然后,有 n 行,每行包含 m 个数字(0 或 1),以空格分隔。最后一行包含一个数字 k。
输出数据
程序应输出具有 k 个连续可用座位的行数。如果有几排有 k 个可用座位,则输出有这些座位的第一排。如果没有这样的行,则输出数字 0。
代码
import java.util.Scanner;
class Main {
static int findRowWithAvailableSeat(int[][] matrix, int tickets) {
final int rows = matrix.length;
final int columns = matrix[0].length;
int seatCounter = 0;
for (int r = 1; r <= rows; r++) {
for (int c = 1; c <= columns; c++) {
if (matrix[r][c] == 1) {
continue;
} if (matrix[r][c] == matrix[r][c + 1]) {
seatCounter++;
if (seatCounter == tickets) {
return r;
}
}
}
}
return 0;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int rows = scanner.nextInt();
int columns = scanner.nextInt();
int[][] matrix = new int[rows][columns];
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
matrix[r][c] = scanner.nextInt();
}
}
int kTickets = scanner.nextInt();
int rowWithAvailableSeats = findRowWithAvailableSeat(matrix, kTickets);
System.out.println(rowWithAvailableSeats);
}
}
我知道问题出在 findRowWithAvailableSeat 方法的某个地方。我想要一个关于如何解决问题的提示,而不是实际的解决方案。非常感谢你。
编辑
我终于可以解决它(或者至少它按预期工作,我不确定它是否是最好的实现)。谢谢大家的提示。
static int findRowWithAvailableSeat(int[][] matrix, int tickets) {
final int rows = matrix.length;
final int columns = matrix[0].length;
int seatCounter;
for (int r = 0; r < rows; r++) {
seatCounter = 0;
for (int c = 0; c < columns; c++) {
if (matrix[r][c] == 1) {
seatCounter = 0;
continue;
}
if (matrix[r][c] == 0) {
seatCounter++;
if (seatCounter == tickets) {
return r + 1;
}
}
}
}
return 0;
}
解决方案
希望这可以帮助
- 在 main() 方法中,您将矩阵从索引 0 设置为 rows-1,从索引 0 设置为 columns-1。但是在 findRowWithAvailableSeat() 上,您从索引 1 开始。因此永远不会访问索引 0。
} if (matrix[r][c] == matrix[r][c + 1]) {
此行将尝试访问索引 c+1,将导致索引越界异常。您需要检查 c+1 是否小于列大小或将 matrix[r][c] 与 0 进行比较(matrix[r][c] == 0)。- 如果您正在寻找相邻的座位,那么您需要在访问已售座位时重置座位计数器(矩阵[r][c] == 1)
- 您还需要为每一行重置座位计数器。
推荐阅读
- c# - 随着时间的推移损坏区域代码不起作用,而使用与地面检查非常相似的代码是有效的?
- javascript - 如何将 vanilla js 获取代码转换为反应?
- woocommerce - 获取最近在 WooCommerce 中添加到购物车的产品的详细信息并触发 Google Analytics 添加到购物车事件
- mongodb - Mongodb:更新数据时“尝试在主机上运行命令'getlasterror'时出现网络错误”
- oracle - 通过其中一个扫描 ip 的数据库连接失败
- angular - Mat菜单总是出现在浏览器的左上角
- python - Python - 带有安全策略的 Opc ua
- javascript - 对将数组推入数组感到困惑,JavaScript
- node.js - 如何修复:42 个漏洞(3 个低、15 个中等、24 个高)?
- postgresql - 优化大型数据集的简单更新查询