Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Откуда взялся 6? / Задача Spiral Matrix на LeetCode

Аркадий Саакян Ученик (162), на голосовании 1 год назад
Задача ( https://leetcode.com/problems/spiral-matrix ):
Given an m x n matrix, return all elements of the matrix in spiral order.

Пример:
Вход: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Выход: [1,2,3,4,8,12,11,10,9,5,6,7]Мой код прошёл первый тест, где была дана матрица n * n, но на этом примере моя программа выводит лишнюю шестёрку в конце: [1,2,3,4,8,12,11,10,9,5,6,7,6]
 class Solution { 
public List spiralOrder(int[][] matrix) {
List result = new ArrayList<>();
for (int i = 0; i <= matrix.length / 2; i++) {
int j;
for (j = i; j < matrix[0].length - i; j++)
result.add(matrix[i][j]);
for (j = i + 1; j < matrix.length - i; j++)
result.add(matrix[j][matrix[0].length - i - 1]);
for (j = matrix[0].length - i - 2; j >= i; j--)
result.add(matrix[matrix.length - i - 1][j]);
for (j = matrix.length - i - 2; j > i; j--)
result.add(matrix[j][i]);
}
return result;
}
}
Голосование за лучший ответ
Sergio 2.1 Оракул (67303) 1 год назад
Ваш код работает правильно для квадратных матриц, но не для прямоугольных. Ошибка возникает из-за того, что в вашем коде не учитывается случай, когда количество строк и столбцов матрицы не равны. В этом случае, последний внутренний цикл for может добавить лишние элементы в результат.

Чтобы исправить эту ошибку, вы можете добавить проверку перед последним внутренним циклом for, чтобы убедиться, что текущий ряд не был уже добавлен в результат. Например:
 for (int i = 0; i <= matrix.length / 2; i++) { 
int j;
for (j = i; j < matrix[0].length - i; j++)
result.add(matrix[i][j]);
for (j = i + 1; j < matrix.length - i; j++)
result.add(matrix[j][matrix[0].length - i - 1]);
for (j = matrix[0].length - i - 2; j >= i && matrix.length - i - 1 != i; j--)
result.add(matrix[matrix.length - i - 1][j]);
for (j = matrix.length - i - 2; j > i && matrix[0].length - i - 1 != i; j--)
result.add(matrix[j][i]);
}
В этом исправленном коде добавлена проверка matrix.length - i - 1 != i перед третьим внутренним циклом for и проверка matrix[0].length - i - 1 != i перед четвертым внутренним циклом for. Эти проверки гарантируют, что текущий ряд или столбец не были уже добавлены в результат.
Оракул Оракул (62089) 1 год назад
У вас в конце в массиве 6,7,6, а должно быть 6,7, изначальна лишняя 6
Похожие вопросы