Ниже приведены два кода (я не слишком хорошо разбираюсь в C++ и новичком использую Java).
JAVA-КОД
Код: Выделить всё
class Solution {
private void setZero(int[][] matrix, int i, int j, boolean row[], boolean col[]){
if(!row[i]){
row[i] = true;
for(int k = 0; k < matrix[0].length; k++) matrix[i][k] = 0;
}
if(!col[j]){
col[j] = true;
for(int k = 0; k < matrix.length; k++) matrix[k][j] = 0;
}
}
public void setZeroes(int[][] matrix) {
ArrayList coords = new ArrayList();
boolean[] row = new boolean[matrix.length], col = new boolean[matrix[0].length];
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == 0){
ArrayList arr = new ArrayList();
arr.add(i);
arr.add(j);
coords.add(arr);
}
}
}
for(int i = 0; i < coords.size(); i++){
ArrayList arr = coords.get(i);
setZero(matrix, arr.get(0), arr.get(1), row, col);
}
}
}
Код: Выделить всё
class Solution {
private:
void setZero(std::vector& matrix, int i, int j, std::vector& row, std::vector& col) {
if (!row[i]) {
row[i] = true;
for (int k = 0; k < matrix[0].size(); k++)
matrix[i][k] = 0;
}
if (!col[j]) {
col[j] = true;
for (int k = 0; k < matrix.size(); k++)
matrix[k][j] = 0;
}
}
public:
void setZeroes(std::vector& matrix) {
std::vector coords;
std::vector row(matrix.size(), false), col(matrix[0].size(), false);
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
if (matrix[i][j] == 0) {
coords.push_back({i, j});
}
}
}
for (int i = 0; i < coords.size(); i++) {
std::vector arr = coords[i];
setZero(matrix, arr[0], arr[1], row, col);
}
}
};
Изменить:
Вопрос дал нам 2D-матрицу с числовыми элементами.
Если элемент в позиции матрицы[j] равен 0, то нам нужно сделать всю строку i и столбец j нулевыми.
пример ->
Код: Выделить всё
1 2 3 5
3 0 2 6
3 4 5 0
шаг 1-> установить нулевую строку 1 и столбец 1
1 0 3 5
0 0 0 0
3 0 5 0
шаг 2-> установить нулевую строку 2 и столбец 3
Код: Выделить всё
1 0 3 0
0 0 0 0
0 0 0 0
coords — это arrayList из arrayList, который используется для хранения координат всех нулевых элементов в матрице (например, если мы обновляем элементы по ходу дела). на первом этапе мы будем считать элементы, изначально ненулевые, нулевыми и получим неправильный ответ).
row и col — это логические массивы, позволяющие узнать, было ли уже установлено значение для конкретной строки/столбца. 0, если да, то мы не устанавливаем его снова в ноль (удаляя избыточность)
Алгоритм->
- Найти все координаты нулевых элементов в исходной матрице
- Используйте метод setZero с параметром i, j, row и col.
- если row/col уже установлен в ноль ничего не делайте
- иначе убедитесь, что каждый элемент в соответствующей строке/столбце равен нулю.
- повторите это для каждого элемента в координатах.
6. end
Подробнее здесь: https://stackoverflow.com/questions/782 ... han-c-code
Мобильная версия