gpt4 book ai didi

Java - 如果二维数组包含目标数字,则将其行/列清零

转载 作者:行者123 更新时间:2023-12-02 06:53:05 24 4
gpt4 key购买 nike

给定一个如下所示的 mxn 矩阵:
1034
1234
3560

需要输出如下内容:
0000
1030
0000

*目标数量为 0。

这是我的解决方案,但我认为它不是很有效(空间和运行时间,我认为是 O(m^2 * n)),并且想知道是否有更简单、更有效的方法来做到这一点。如果是,那是什么?

int[][] m = { { 1, 0, 3, 4 }, { 1, 2, 3, 4 }, { 3, 5, 6, 0 } };  
m = zero(m, 0);

public static int[][] zero(int[][] m, int num) {

int rows = m.length;
int columns = m[0].length;
int [][] myInt = new int[rows][];
for(int i = 0; i < rows; i++){
myInt[i] = m[i].clone();
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (myInt[i][j] == num) {
m[i] = new int[columns];
for(int k = 0; k < rows; k++){
m[k][j] = 0;
}
break;
}
}
}
return m;
}

基本上,我首先克隆输入矩阵,然后迭代每一行并检查该行是否包含我的目标数字。如果是,那么我将原始矩阵中的整行设置为零。然后,我执行另一个循环,将包含目标数字的列设置为零。我从一开始就克隆了矩阵,因此检查始终针对克隆的引用矩阵,而不是每次迭代时修改的引用矩阵。

最佳答案

我建议使用 BitSet 作为行/列索引。

public static void zero(int[][] m, int num) {

int rows = m.length;
int columns = m[0].length;
BitSet rowsToClear = new BitSet(rows);
BitSet columnsToClear = new BitSet(columns);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (m[i][j] == num) {
rowsToClear.set(i);
columnsToClear.set(j);
}
}
}
for (int i = rowsToClear.nextSetBit(0); i >= 0;
i = rowsToClear.nextSetBit(i + 1)) {
Arrays.fill(m[i], 0);
}
for (int j = columnsToClear.nextSetBit(0); j >= 0;
j = columnsToClear.nextSetBit(j + 1)) {
for (int i = 0; i < rows; ++i) {
m[i][j] = 0;
}
}
//return m;
}

关于Java - 如果二维数组包含目标数字,则将其行/列清零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17779098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com