54 - Spiral Matrix

#medium
Given an m x n matrix, return all elements of the matrix in spiral order.

Example 1:

Input: matrix = {[1,2,3],[4,5,6],[7,8,9]}
Output: [1,2,3,6,9,8,7,4,5]

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        int v_size = m * n;
        int startx = 0, starty = 0, offset = 1, loop, i , j, k = 0;
        vector<int> v_result( v_size, 0 );
        if ( m < n ) loop = m / 2;
        else loop = n / 2;
        for ( ;loop > 0; loop--) {
            i = startx;
            j = starty;
            
            for ( i = startx; i < n - offset; i++ ) {
                v_result[k] = matrix[j][i];
                k++;
            }

            for ( j = starty; j < m - offset; j++ ) {
                v_result[k] = matrix[j][i];
                k++;
            }

            for ( ; i > startx; i-- ) {
                v_result[k] = matrix[j][i];
                k++;
            }

            for ( ; j > starty; j-- ) {
                v_result[k] = matrix[j][i];
                k++;
            }
            startx++;
            starty++;
            offset++;
        }


        if ( m < n && (m % 2 == 1 ) ) {
            for ( i = startx, j = starty; i < n - offset + 1; i++ ) {
                v_result[k] = matrix[j][i];
                k++;
            }
        }
        else if ( m > n && (n % 2 == 1 ) ) {
            for ( i = startx, j = starty; j < m - offset + 1; j++ ) {
                v_result[k] = matrix[j][i];
                k++;
            }
        } 
        else if ( m == n && (n % 2 == 1 ) ) {
            v_result[k] = matrix[startx][startx];
        }  

        return v_result;
    }
};