Сегодня мой 56-й день кодинга. Я решил один вопрос по матрице (массив 2d)

Проблема: Спиральный обход матрицы

Дана матрица размера r*c. Пройдите матрицу по спирали.

Пример 1:

Input:
r = 4, c = 4
matrix[][] = {{1, 2, 3, 4},
           {5, 6, 7, 8},
           {9, 10, 11, 12},
           {13, 14, 15,16}}
Output: 
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
Explanation:

Пример 2:

Input:
r = 3, c = 4  
matrix[][] = {{1, 2, 3, 4},
           {5, 6, 7, 8},
           {9, 10, 11, 12}}
Output: 
1 2 3 4 8 12 11 10 9 5 6 7
Explanation:
Applying same technique as shown above, 
output for the 2nd testcase will be 
1 2 3 4 8 12 11 10 9 5 6 7.

Ваша задача
Вам не нужно ничего читать или печатать. Завершите функцию spirallyTraverse(), которая принимает matrix, r и c в качестве входных параметров и возвращает список целых чисел. обозначающий спиральный обход матрицы.

Ожидаемая временная сложность: O(r*c)
Ожидаемое вспомогательное пространство: O(r*c), только для возврата ответа.

Решение (в Java):

class Solution
{
    //Function to return a list of integers denoting spiral traversal of matrix.
    static ArrayList<Integer> spirallyTraverse(int matrix[][], int r, int c)
    {
       ArrayList<Integer> a= new ArrayList<>();
        int i, k=0, l=0;
        
        while(k<r && l<c){
            
            for( i=l ; i<c; ++i)
            a.add(matrix[k][i]);
            
            k++;
            
            for(i=k; i<r; ++i)
            a.add(matrix[i][c-1]);
             
            c--;
            
            if(k<r){
                for(i=c-1; i>=l; --i)
                a.add(matrix[r-1][i]);
                
                r--;
            }
            if(l<c){
                for(i=r-1; i>=k; --i)
                    a.add(matrix[i][l]);
                    
                    l++;
            }
            
           
        }
        return a;
    }
}